2011-11-22 50 views
1

我有以下頂點着色器:OpenGL的頂點着色器運行時問題(不使用維也納組織或紋理)

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的這個問題。

有什麼建議嗎?

我很抱歉模糊的標題,但我甚至不知道這會是什麼類型的問題。

+1

哪個GL版本? –

+0

我相信我正在使用2.1,但我使用的是任何版本的Ubuntu 11.10使用(或QT,如果它明確使用不同的版本) –

+0

不知道這是你的問題,但你已經定義你的位置屬性爲vec4在你的着色器,但您只能通過glVertexAttribPointer爲該屬性傳遞兩個組件。它可能不會傷害任何東西,但我敢打賭它會在某些時候咬你;) –

回答

2

你在着色器編譯期間檢查glGetShaderInfoLogglGetProgramInfoLog嗎?如果沒有,那麼我會建議作爲第一個停靠港。

接下來要檢查的是你的紋理座標的綁定。屬性設置是否正確?數據是否有效?

最後,開始通過自由噴灑glGetError來調用您的代碼。它幾乎肯定會在glDrawArrays上失敗,這對你無能爲力,但通常在絕望爲我設置時!

OR

你可以嘗試gDEBugger。我主要用它來尋找瓶頸,並確保我正確地釋放OpenGL資源,因此不能擔保調試器,但值得一試。

+0

這些是非常有用的工具,謝謝你指出。 –

0

顯然你需要實際使用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); 

使其工作。

0

同樣的問題,不同的原因。

對於某些設備,glLinkProgram中的自動變量鏈接不能按照指定的方式工作。

確保一切按以下順序進行:

  1. glCreateProgram

  2. glCreateShader & & glCompileShader兩種着色器

  3. glBindAttribLocation所有屬性

  4. glLinkProgram

步驟3以後可以在任何時候重新綁定變量不同的緩衝槽被重複 - 但是僅改變成爲另一個調用glLinkgProgram後有效。

或短:每當你調用glBindAttribLocation確保glLinkProgram調用之後。