OpenGL顶点着色器运行时问题(不使用VBOs或纹理)

OpenGL Vertex Shader Runtime Issues (not using VBOs or textures)

本文关键字:VBOs 纹理 顶点 问题 运行时 OpenGL      更新时间:2023-10-16

我有以下顶点着色器:

uniform mat4 uMVP;
attribute vec4 aPosition;
attribute vec4 aNormal;
attribute vec2 aTexCoord;
varying vec2 vTexCoord;
varying vec4 vPrimaryColor;
void main() {
  gl_Position = uMVP * aPosition;
  vPrimaryColor = vec4(1.0, 1.0, 1.0, 1.0);
  vTexCoord = aTexCoord;
}

和下面的片段着色器:

uniform sampler2D sTex;
varying vec2 vTexCoord;
varying vec4 vPrimaryColor;
void main() {
  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

请注意,虽然我有一个vTexCoord和vPrimaryColor,这两个都没有在片段着色器中使用。(他们在那里的原因是因为他们最终会在那里)。

现在,我也将uMVP设置为单位矩阵,并使用以下代码进行绘制:

// Load the matrix
glUniformMatrix4fv(gvMVPHandle, 1, false, &mvPMatrix.matrix[0][0]);
// Draw the square to be textured
glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glEnableVertexAttribArray(gvPositionHandle);
glVertexAttribPointer(gvTexCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glDrawArrays(GL_QUADS, 0, 4);

其中正方形是:

const GLfloat PlotWidget::gFullScreenQuad[] = { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f};

所以,当我运行这个程序时,我得到一个黑屏。这似乎出乎你的意料。但是,当我更改阴影中的行时:

vTexCoord = aTexCoord;

vTexCoord = vec2(1.0, 1.0);

效果很好。我会假设代码的问题出在那行代码上,但我想不出opengl中有什么会导致这个。此外,我在这个项目中使用Qt,这意味着这个类正在使用QGLWidget。我在OpenGL ES 2.0中从来没有遇到过这个问题。

有什么建议吗?

很抱歉我的标题很模糊,但我甚至不知道这是哪一类的问题。

您是否在着色器编译期间检查glGetShaderInfoLog和glGetProgramInfoLog ?如果没有的话,我建议把它作为第一停靠港。

接下来要检查的是纹理坐标的绑定。是否正确设置了属性?数据是否有效?

最后,开始逐步遍历代码,使用大量的glGetError调用。它几乎肯定会在gldrawarray上失败,这对你没有多大帮助,但这通常是我感到绝望的时候!

你可以试试gDEBugger。我使用它主要是为了寻找瓶颈,并确保我正确地释放OpenGL资源,所以不能保证调试器,但它值得一试。

显然你需要实际使用整个使用glEnableVertexAttribArray,如果它被传递到片段着色器。我不知道为什么。但是将绘图代码更改为:

glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glEnableVertexAttribArray(gvPositionHandle);
glVertexAttribPointer(gvTexCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glEnableVertexAttribArray(gvTexCoordHandle);
glDrawArrays(GL_QUADS, 0, 4);

同样的问题,不同的原因。

对于某些设备,glLinkProgram中的自动变量链接不能按指定的方式工作。

确保事情按照以下顺序完成:

  1. glCreateProgram

  2. glCreateShader,,glCompileShader用于两个着色器

  3. 所有属性的glBindAttribLocation

  4. glLinkProgram

步骤3可以在以后的任何时候重复以将变量重新绑定到不同的缓冲区槽-但是更改只有在再次调用glLinkgProgram后才有效。

或简称:当你调用glBindAttribLocation时,确保后面有一个glLinkProgram调用