2012-03-01 103 views
3

我有一些問題上傳到GPU的小矢量vec4 s。我將這個問題歸結爲最基本的代碼來拋出錯誤。GLES20.glUniform4fv正在給GL_INVALID_OPERATION(1282)

這裏是我的片段着色器:

precision mediump float; 
uniform vec4 test[5]; 
void main() { 
    gl_FragColor = test[0]+test[1]+test[2]+test[3]+test[4]; 
} 

和頂點着色器很簡單:

attribute vec4 vPosition;   
void main(){ 
    gl_Position = vPosition; 
} 

這是一種嘗試上傳vec4向量代碼:

float[] testBuffer = new float[4*5]; 
    // Fill with 1/5s for now 
    Arrays.fill(testBuffer, 0.2f); 

    // Get the location 
    int testLoc = GLES20.glGetUniformLocation(mProgram, "test"); 
    checkGlError("glGetUniformLocation test"); 

    // Upload the buffer 
    GLES20.glUniform4fv(testLoc, 5, testBuffer, 0); 
    checkGlError("glUniform4fv testBuffer"); 

第二次致電checkGlError()時發現錯誤,並且發生錯誤或者代碼是GL_INVALID_OPERATION。

我讀過文檔on glUniform,所有的尺寸和類型看起來都是正確的。 testLoc是一個有效的位置句柄,我在上傳片段和頂點着色器代碼時沒有錯誤。

我只是不能看到我做錯了什麼!有任何想法嗎?

--UPDATED

+0

確保着色器在編譯過程中未被優化太多,以至於只使用第一項,test []已成爲單個vec4。 – Jave 2012-03-01 14:13:43

+0

感謝Jave,但我非常肯定這不是問題,因爲我嘗試上載所有不同大小的載體(包括1個載體),到目前爲止沒有任何工作。我甚至嘗試過使用標量'vec4'並使用'glUniform4f()'來上傳一組值。這也失敗了。 – 2012-03-01 14:23:31

+0

你應該嘗試閱讀所有職位以及上傳到。着色器編譯器只會查看你在着色器中使用的內容,並刪除那裏沒有使用的任何東西。 – Jave 2012-03-01 14:27:48

回答

7

glUniform文檔:產生

GL_INVALID_OPERATION如果沒有當前程序 對象

確保你的shader當前綁定/調用glUniform時使用(已使用相應的着色器程序句柄調用glUseProgram)。當解除綁定着色器時,制服保持其值(例如glUseProgram(0)),但是在設置統一值時程序必須處於活動狀態。

+0

就是這樣!謝謝Christian,我以爲我瘋了! – 2012-03-01 14:49:30

+0

感謝您結束我的調試苦難! – Chin 2016-03-30 05:44:44

相關問題