OpenGL顶点着色器运行时问题(不使用VBOs或纹理)
OpenGL Vertex Shader Runtime Issues (not using VBOs or textures)
我有以下顶点着色器:
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中的自动变量链接不能按指定的方式工作。
确保事情按照以下顺序完成:
-
glCreateProgram
-
glCreateShader,,glCompileShader用于两个着色器
-
所有属性的glBindAttribLocation
-
glLinkProgram
步骤3可以在以后的任何时候重复以将变量重新绑定到不同的缓冲区槽-但是更改只有在再次调用glLinkgProgram后才有效。
或简称:当你调用glBindAttribLocation时,确保后面有一个glLinkProgram调用
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 纹理单位重叠?渲染了错误的纹理
- SFML 纹理变换(放大)
- SDL2 二维纹理分配/池化
- Qt OpenGL 渲染到纹理性能问题
- 为什么我会得到黑色纹理?
- glBindTexture 是否覆盖活动纹理单元的内容
- OpenGL顶点着色器运行时问题(不使用VBOs或纹理)