我的程序原本打算在屏幕上绘制一个简单的带纹理的立方体,但是,除了清晰的颜色之外,我无法获得它来呈现其他任何东西。这是我的绘画功能:
void testRender() {
glClearColor(.25f, 0.35f, 0.15f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUniformMatrix4fv(resources.uniforms.m4ModelViewProjection, 1, GL_FALSE, (const GLfloat*)resources.modelviewProjection.modelViewProjection);
glEnableVertexAttribArray(resources.attributes.vTexCoord);
glEnableVertexAttribArray(resources.attributes.vVertex);
//deal with vTexCoord first
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,resources.hiBuffer);
glBindBuffer(GL_ARRAY_BUFFER, resources.htcBuffer);
glVertexAttribPointer(resources.attributes.vTexCoord,2,GL_FLOAT,GL_FALSE,sizeof(GLfloat)*2,(void*)0);
//now the other one
glBindBuffer(GL_ARRAY_BUFFER,resources.hvBuffer);
glVertexAttribPointer(resources.attributes.vVertex,3,GL_FLOAT,GL_FALSE,sizeof(GLfloat)*3,(void*)0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, resources.htextures[0]);
glUniform1i(resources.uniforms.colorMap, 0);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (void*)0);
//clean up a bit
};
另外,这是顶点着色器:
#version 330
in vec3 vVertex;
in vec2 vTexCoord;
uniform mat4 m4ModelViewProjection;
smooth out vec2 vVarryingTexCoord;
void main(void) {
vVarryingTexCoord = vTexCoord;
gl_Position = m4ModelViewProjection * vec4(vVertex, 1.0);
};
和片段着色器(我现在已经放弃了纹理):
#version 330
uniform sampler2D colorMap;
in vec2 vVarryingTexCoord;
out vec4 vVaryingFragColor;
void main(void) {
vVaryingFragColor = texture(colorMap, vVarryingTexCoord);
vVaryingFragColor = vec4(1.0,1.0,1.0,1.0);
};
位置坐标的顶点数组缓冲区创建一个简单的立方体(所有坐标均为0.25),而Modelview投影只是应用于视角矩阵的逆相机矩阵(向后移动两倍)。但是,即使没有矩阵变换,我也无法在屏幕上看到任何东西。最初,我有两个不同的缓冲区,需要两个不同的元素索引列表,但是现在两个缓冲区(包含顶点和纹理坐标数据)的长度和顺序都相同。代码本身来自Durian Software Tutorial和最新的OpenGL Superbible。其余代码为here。
至此,我已经尝试了几乎所有我能想到的东西。该代码是否甚至远程关闭?如果是这样,为什么我什么也不能在屏幕上渲染?
最佳答案
到目前为止,您看起来还不错。
我现在唯一看到的是您已启用DEPTH_TEST,但是您没有清除深度缓冲区。即使将缓冲区初始化为一个不错的值,您也会在第一帧之后的每一帧上绘制空白场景,因为未清除深度缓冲区。
如果这样做没有帮助,您可以确保没有glGetError()
错误吗?您可能需要清理未使用的纹理属性/制服以清除错误,但这是我的下一步。