2014-02-11 28 views
0

這應該是一個簡單的任務,但我失敗了。第一個認罪:我對OpenGL知之甚少,我學到的一些東西來自各種教程(其中一些可能已過時並棄用)如何在片段着色器中使用沒有插值的純色繪製三角形?

我試圖繪製一個使用定義在運行。四邊形繪製的尺寸和位置正確,但顏色錯誤。這是我的頂點和片段着色器:

public static final String VS_SOLIDCOLOR = 
     "uniform mat4 uMVPMatrix;" + 
     "attribute vec4 aPosition;" + 
     "attribute vec4 aColor;" + 
     "varying vec4 vColor;" + 
     "void main() {" + 
     " gl_Position = uMVPMatrix * aPosition;" + 
     " vColor = aColor;" + 
     "}"; 

public static final String FS_SOLIDCOLOR = 
     "precision mediump float;" + 
     "varying vec4 vColor;" + 
     "void main() {" + 
     " gl_FragColor = vColor;" + 
     "}"; 

顏色設置是這樣的(我已刪除GL錯誤校驗和檢查colorHandle == -1):

float r = 1.0f; 
    float g = 0.0f; 
    float b = 0.0f; 
    float a = 1.0f; 
    final int colorHandle = GLES20.glGetAttribLocation(shaderProgramSolidColor, "aColor"); 
    GLES20.glVertexAttrib4f(colorHandle, r, g, b, a); 

我本來期望的上面的代碼導致實心的紅色三角形,但它們最終爲純黃色。從我讀過的片段着色器中將插入vColor向量,但我不想(也不知道爲什麼它最終會變成黃色)。我如何在運行時設置顏色,並在三角形上繪製出未改變的顏色?

PS如果我是這樣做的片段着色器,我會得到一個堅實的紅色爲我的整個四:

gl_FragColor = vec4(1,0,0,1); 

讓我知道,如果你需要我張貼更多的代碼。

回答

1

我發現我做錯了。我的印象是,我只能在運行時在頂點着色器中設置變量,但也可以操作片段着色器。我的着色器應該是這樣的:

public static final String VS_SOLIDCOLOR = 
     "uniform mat4 uMVPMatrix;" + 
     "attribute vec4 aPosition;" + 
     "void main() {" + 
     " gl_Position = uMVPMatrix * aPosition;" + 
     "}"; 

public static final String FS_SOLIDCOLOR = 
     "precision mediump float;" + 
     "uniform vec4 uColor;" + 
     "void main() {" + 
     " gl_FragColor = uColor;" + 
     "}"; 

而且這樣設置:

final int colorHandle = GLES20.glGetUniformLocation(shaderProgramSolidColor, "uColor"); 
    GLES20.glUniform4f(colorHandle, r, g, b, a); 
相關問題