使用着色器和 VBO 绘制四边形

Posted

技术标签:

【中文标题】使用着色器和 VBO 绘制四边形【英文标题】:Drawing quads with shaders and VBO 【发布时间】:2014-05-06 07:30:28 【问题描述】:

我正在尝试使用着色器和 VBO 绘制两个简单的四边形。但作为输出,我只得到一个四边形。

我在哪里遗漏了什么?

初始化代码(跳过着色器和矩阵初始化代码):

  gl.GenBuffers((int) VAO_IDs.NumVAOs, VAOs);
            gl.BindVertexArray(VAOs[(int) VAO_IDs.Guads]);

            float[] vertices =
            
               -0.095f, 0.095f, 0.695f, //first quad 
               -0.095f, 0.0475f, 0.695f,
               -0.095f, 0.00475f, 0.7455f,
               -0.095f, 0.095f,  0.7455f,

               -0.095f, 0.0475f, 0.695f, //second quad 
               -0.095f, 0f, 0.695f,
               -0.095f, 0f, 0.7455f,
               -0.095f, 0.0475f, 0.7455f
            ;

            gl.GenBuffers((int) Buffer_IDs.NumBuffers, Buffers);
            gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, Buffers[(int) Buffer_IDs.ArrayBuffer]);
  unsafe
            
                fixed (float* verts = vertices)
                
                    var prt = new IntPtr(verts);

                    gl.BufferData(OpenGL.GL_ARRAY_BUFFER, vertices.Length*sizeof (float), prt, OpenGL.GL_STATIC_DRAW);
                
            


            gl.VertexAttribPointer((uint)Attrib_IDs.vPosition, 3, OpenGL.GL_FLOAT, false, 0, new IntPtr(0));
            gl.EnableVertexAttribArray((uint)Attrib_IDs.vPosition);

显示代码:

 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT | OpenGL.GL_STENCIL_BUFFER_BIT);

 shaderProgram.Bind(gl);
 shaderProgram.SetUniformMatrix4(gl, "projectionMatrix", projectionMatrix.to_array());
 shaderProgram.SetUniformMatrix4(gl, "viewMatrix", viewMatrix.to_array());
 shaderProgram.SetUniformMatrix4(gl, "modelMatrix", modelMatrix.to_array());


    gl.BindVertexArray(VAOs[(int)VAO_IDs.Guads]);

    gl.DrawArrays(OpenGL.GL_QUADS, 0, 8);

    shaderProgram.Unbind(gl);
    gl.Flush();

【问题讨论】:

【参考方案1】:

冒着指出显而易见的风险:您的两个四边形的坐标已设置为彼此相邻。如果你画两个紧挨着的四边形,你会得到……一个更大的四边形。尝试使用在两个四边形之间留有间隙的坐标,看看它们是否分开显示。

您的坐标似乎有一个小错字:

           -0.095f, 0.0475f, 0.695f,
           -0.095f, 0.00475f, 0.7455f,

您可能打算对两个 y 坐标使用相同的值。但这只是使两个四边形部分重叠,它们仍然形成一个四边形。

【讨论】:

以上是关于使用着色器和 VBO 绘制四边形的主要内容,如果未能解决你的问题,请参考以下文章

VBO:未绘制数组

没有 VAO 的每个着色器属性的 VBO 或不同的方法?

Opengl/glsl 试图为绘制四边形编写着色器,但不确定如何处理屏幕纵横比的变化

如何在 OpenGL 3.2 中绘制全屏四边形?

我可以使用顶点着色器来显示模型法线吗?

第二篇: WebGL 着色器和GLSL