2012-02-11 155 views
2

我目前正在爲Android構建一個應用程序,但遇到了一些拒絕渲染的着色器的問題。GLSL着色器不會渲染統一變量的顏色

考慮以下片段着色器:

uniform vec4 color; 
void main(){ 
    gl_FragColor = vec4(1.0); 
} 

此着色器工作正常在純色繪製對象(在這種情況下的白色)。統一矢量color已被優化,並且無法使用glGetUniformLocation()(返回-1)找到。

試圖從統一的可變顏色可以做到像這樣:

uniform vec4 color; 
void main(){ 
    gl_FragColor = color; 
} 

然而,當我用這個,沒什麼渲染。着色器已成功創建,並且glGetUniformLocation()爲顏色返回有效值(0)。但屏幕上沒有顯示,甚至沒有顯示黑色。唯一的改變是用color代替vec4(1.0)。 這段代碼有相同的結果:

uniform vec4 color; 
void main(){ 
    gl_FragColor = vec4(1.0)+color; 
} 

奇怪的是,當我在不同的項目中嘗試過的着色器,它的作品,因爲它應該,所以問題一定是出在我的代碼做到萬無一失。
這是我的繪製方法(請記住,它的工作原理當彩色變量不是在着色器):

GLES20.glUseProgram(colorshader); 
GLES20.glUniform4f(colorIndex, 1, 1, 1, 1); //colorIndex is the result of glGetUniformLocation() called with the correct shader index and variable name. 

Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, matrix, 0); 
GLES20.glUniformMatrix4fv(matrixindex, 1, false, mvpMatrix, 0); 

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertices); 
GLES20Fix.glVertexAttribPointer(Shader.ATTRIBUTE_VERTEX, 3, GLES20.GL_FLOAT, false, 12, 0); 

GLES20.glLineWidth(width); 
GLES20.GL_UNSIGNED_SHORT, 0); 
GLES20.glDrawArrays(GLES20.GL_LINES, 0, count); 

我完全不知道什麼可能導致這個奇怪的行爲,如果任何人有任何想法或可能的解決方案,請幫助我。

更新:
看來,使用任何勻變速不是採樣造成這種情況(僅此)着色此行爲。

更新2 使用glGetError()返回錯誤代碼502: GL_INVALID_OPERATION

+0

「但屏幕上沒有顯示,甚至沒有顯示黑色。」這表明某處存在錯誤。你檢查錯誤嗎? – 2012-02-11 16:07:49

+0

@NicolBolas:我的想法是,我在創建着色器時沒有遇到任何明確的錯誤,並且因爲我可以爲顏色統一獲得一個值,所以它在過程中稍後會出錯。不幸的是我不知道如何調試。 'glGetError()'可能對代碼有幫助嗎? – Jave 2012-02-11 17:06:29

+0

'glGetError'就是你應該使用的。 – 2012-02-11 17:07:45

回答

1

好的,所以我終於在經過一系列測試後才發現它。
在我的代碼,我用多個着色器,但我不得不小心只得到了mvpMatrix均勻的一個着色器,並使用一個爲每個着色器,其中有趣的是工作了的所有着色器我創建這個有過一個(它爲所有較早的着色器獲得了0)。
但是,使用這個着色器,我的新vec4似乎有id 0,導致代碼錯誤地將我的矢量數據分配給mvp矩陣。爲每個着色器獲取新的ID可以使程序起作用。

-4

顏色未初始化,很可能是着色器中止。

+0

它以哪種方式單元化? – 2012-02-11 16:20:34

+0

如果colorIndex持有它,它不是未初始化的。但是,我沒有這樣解釋渲染代碼,這可能是錯誤的。我仍然會嘗試在着色器中初始化顏色矢量以查看是否有任何效果。 – Tobias 2012-02-11 16:41:51

+0

colorindex爲變量保存一個有效值,因此它被正確初始化。 – Jave 2012-02-11 17:07:35