2012-08-24 87 views
2

我的程序是爲了在屏幕上繪製一個簡單的紋理立方體,但是,我無法讓它呈現除了清晰顏色以外的其他任何東西。這是我的繪製函數:OpenGL問題:無法在屏幕上渲染幾何圖形

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),而模型視圖投影只是應用於視角的逆攝像機矩陣(向後移動兩倍) ve矩陣。但是,即使沒有矩陣轉換,我也無法在屏幕上看到任何東西。最初,我有兩個不同的緩衝區,需要兩個不同的元素索引列表,但現在兩個緩衝區(包含頂點和紋理座標數據)的長度和順序相同。代碼本身來自Durian Software Tutorial和最新的OpenGL Superbible。其餘的代碼是here

在這一點上,我嘗試了幾乎所有我能想到的。這段代碼是否遠程關閉?如果是這樣,爲什麼我不能在屏幕上顯示任何東西?

回答

3

到目前爲止你看起來還不錯。

我現在看到的唯一一件事就是您已啓用DEPTH_TEST,但您並未清除深度緩衝區。即使緩衝區初始化爲一個很好的值,你也會在第一幀之後的每一幀上繪製空的場景,因爲深度緩衝區沒有被清除。

如果這沒有幫助,你能確保你沒有glGetError()錯誤?您可能需要清理未使用的紋理屬性/制服,以使錯誤變得乾淨,但這將是我的下一步。

+0

你說得對,它是深度緩衝區。關於glGetError;我以前曾經通過一些OpenGL調試器來運行這個錯誤,並且沒有任何結果。但是,它也顯示深度緩衝區完全是「黑色」。深度緩衝區是否始終以這種方式初始化? – Louie

+0

如果初始值已定義,我並不積極,但您可以使用glClearDepth設置清除值。默認值爲1,這意味着在清除之後,任何深度小於1的東西(全部)將通過深度測試。如果你說緩衝區是黑色的,那聽起來像是0的值,這意味着什麼都不能通過深度測試。這聽起來與你所看到的一致。 – Tim