2012-07-11 79 views
2

我一直在將一些舊代碼轉換爲OpenGL 3,並且我已經完成了大部分工作。所有的VAO,VBO等工作都很好,經OpenGL調試程序驗證,我的着色器編譯得很好,但屏幕上除了清晰的顏色外沒有任何東西出現。我認爲我所有的矩陣都應該沒問題,但我不確定投影矩陣是否應該將負Z座標轉換爲正值;我試過的每個代碼示例都會生成這樣的矩陣。這裏是我的着色器:OpenGL 3程序空白屏幕

頂點着色器:

#version 330 

uniform mat4 modelview; 
uniform mat4 projection; 

in vec4 position; 
in vec4 normal; 
in vec4 texCoord; 

void main() { 
    gl_Position = projection * modelview * position; 
} 

片段着色器:

#version 330 

out vec4 fragColor; 

void main() { 
    fragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 

我的代碼是複雜的,所以我就發佈一個修改,註釋的glIntercept通話記錄的版本,它應該有所有相關的電話:

//Create shaders 
glCreateShader(GL_VERTEX_SHADER)=1 
glShaderSource(1,1,vertShaderText,vertShaderTextLen) 
glCompileShader(1) 
glGetShaderiv(1,GL_COMPILE_STATUS,buf) 
glCreateShader(GL_FRAGMENT_SHADER)=2 
glShaderSource(2,1,fragShaderText,fragShaderTextLen) 
glCompileShader(2) 
glGetShaderiv(2,GL_COMPILE_STATUS,buf) 
glCreateProgram()=3 
glAttachShader(3,1) 
glAttachShader(3,2) 
glLinkProgram(3) 
glGetProgramiv(3,GL_LINK_STATUS,buf) 
//Find uniform/attribute locations 
//Extra glUseProgram() calls are for safety. 
glGetUniformLocation(3,"modelview")=0 
glUseProgram(3) 
glGetUniformLocation(3,"projection")=1 
glUseProgram(3) 
glGetAttribLocation(3,"position")=0 
glUseProgram(3) 
glGetAttribLocation(3,"normal")=-1 
glUseProgram(3) 
glGetAttribLocation(3,"texCoord")=-1 
//Create a texture; probably irrelevant to this code 
glGenTextures(1,texId) 
glBindTexture(GL_TEXTURE_2D,1) 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR) 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,256,256,0,GL_RGBA,GL_UNSIGNED_BYTE,texData) 
glGenTextures(1,01DD275C) 
//Create VAO, VBO 
glGenVertexArrays(1,vaoId) 
glBindVertexArray(1) 
glGenBuffers(1,bufId) 
glBindBuffer(GL_ARRAY_BUFFER,1) 
//Redundant call; actual data set later 
glBufferData(GL_ARRAY_BUFFER,0,00000000,GL_STATIC_DRAW) 

glGenBuffers(1,indexBufId) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,4) 
glBufferData(GL_ELEMENT_ARRAY_BUFFER,0,00000000,GL_STATIC_DRAW) 

//Set up buffer data 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,4) 
glBufferData(GL_ELEMENT_ARRAY_BUFFER,96,indexData,GL_STATIC_DRAW) 
glBindBuffer(GL_ARRAY_BUFFER,1) 
glBufferData(GL_ARRAY_BUFFER, 48,01DC3D00,GL_STATIC_DRAW) 

//Start drawing 
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) 
glUseProgram(3) 
glUseProgram(3) 
//Modelview 
glUniformMatrix4fv(modelviewLocation,1,false,[1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-6.000000,1.000000]) 
glUseProgram(3) 
//Projection 
glUniformMatrix4fv(projectionLocation,1,false,[0.200000,0.000000,0.000000,0.000000,0.000000,0.150000,0.000000,0.000000,0.000000,0.000000,-1.000200,-1.000000,0.000000,0.000000,-0.200020,0.000000]) 
//Bind VAO, VBOs, and attribute positions 
glBindVertexArray(1) 
glBindBuffer(GL_ARRAY_BUFFER,1) 
glVertexAttribPointer(positionAttributeLocation,3,GL_FLOAT,false,12,00000000) 
glEnableVertexAttribArray(positionAttributeLocation) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,4) 
glDrawElements(GL_TRIANGLES,24,GL_UNSIGNED_INT,00000000) GLSL=3 Textures[ (0,2) ] 
glDisableVertexAttribArray(0) 

我有一架飛機直接面對c amera,但它根本沒有出現。我看到的只是清晰的顏色。剔除和深度測試已關閉。

+0

我已經做了一些更多的調試工作;使用AMD的GPUPerfStudio,我可以驗證這些原語是由glDrawElements正確發送的,但他們永遠不會到達屏幕。我不確定什麼可以阻止他們達成目標;我盡了最大努力來驗證我所有的矩陣,甚至嘗試使用一個標識投影矩陣;似乎沒有任何工作。 – blm768 2012-07-13 00:37:44

+0

從我所看到的片段着色器只會顯示紅色像素。那是你想要的嗎? – user892644 2013-05-07 02:31:27

回答

0

事實證明,我的問題是在我的初始化代碼。我有未初始化的變量傳遞給glViewport,給我一個0x0視口。

0

當傳遞制服我在使用方式如下glGetUniformLocation()着色器:

myUniformLocation = glGetUniformLocation(program, "myUniform") 
glUniform1f(myUniformLocation, variable_value) 
+0

這基本上是我使用的形式;到編輯呼叫跟蹤時,我已經停止用描述性變量名稱替換跟蹤值。我應該解決這個問題。 – blm768 2012-07-11 15:52:03

0

你的日誌不顯示任何glEnableVertexAttribArray電話。你忘了嗎?

+0

它看起來不是在第一幀中調用的,而是在之後的每一幀中調用的。我解決了這個問題。仍然沒有運氣。 – blm768 2012-07-11 16:19:33