OpenGL 问题:无法在屏幕上渲染几何图形

Posted

技术标签:

【中文标题】OpenGL 问题:无法在屏幕上渲染几何图形【英文标题】:OpenGL issue: cannot render geometry on screen 【发布时间】:2012-08-24 21:05:43 【问题描述】:

我的程序打算在屏幕上绘制一个简单的纹理立方体,但是,除了清晰的颜色之外,我无法让它渲染任何东西。这是我的绘图功能:

    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),而模型视图投影只是应用于透视矩阵的逆相机矩阵(向后移动两倍)。但是,即使没有矩阵变换,我也无法在屏幕上看到任何内容。最初,我有两个不同的缓冲区,需要两个不同的元素索引列表,但现在两个缓冲区(包含顶点和纹理坐标数据)的长度和顺序相同。代码本身源自Durian Software Tutorial 和最新的OpenGL Superbible。其余代码为here。

到目前为止,我已经尝试了几乎所有我能想到的东西。这段代码甚至远程关闭吗?如果是这样,为什么我不能在屏幕上渲染任何东西?

【问题讨论】:

【参考方案1】:

到目前为止,你看起来还不错。

我现在唯一看到的是您启用了 DEPTH_TEST,但您没有清除深度缓冲区。即使缓冲区初始化为一个合适的值,您也会在第一帧之后的每一帧上绘制空场景,因为深度缓冲区没有被清除。

如果这没有帮助,你能确保你没有glGetError() 错误吗?您可能需要清理未使用的纹理属性/制服以清除错误,但这将是我的下一步。

【讨论】:

你是对的,它是深度缓冲区。关于glGetError;我之前曾通过一些 OpenGL 调试器运行此程序,但出现错误但一无所获。但是,它也将深度缓冲区显示为完全“黑色”。深度缓冲区是否总是以这种方式初始化? 如果定义了初始值,我不肯定,但是您可以使用glClearDepth设置清除值。默认值为 1,表示你清除后,任何深度小于 1(所有)的东西都通过了深度测试。如果你说缓冲区是黑色的,那听起来像是一个 0 的值,这意味着没有任何东西可以通过深度测试。这听起来与您所看到的一致。

以上是关于OpenGL 问题:无法在屏幕上渲染几何图形的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL学习随笔-- OpenGL ES 2.0渲染管线

屏幕卡顿 及 iOS中OpenGL渲染架构分析

OpenGL基础学习之三渲染知识

OpenGL中着色器,渲染管线,光栅化

制作没有屏幕的 OpenGL 上下文

[OpengGL]渲染流程和程序流程