我有一些問題上傳到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
確保着色器在編譯過程中未被優化太多,以至於只使用第一項,test []已成爲單個vec4。 – Jave 2012-03-01 14:13:43
感謝Jave,但我非常肯定這不是問題,因爲我嘗試上載所有不同大小的載體(包括1個載體),到目前爲止沒有任何工作。我甚至嘗試過使用標量'vec4'並使用'glUniform4f()'來上傳一組值。這也失敗了。 – 2012-03-01 14:23:31
你應該嘗試閱讀所有職位以及上傳到。着色器編譯器只會查看你在着色器中使用的內容,並刪除那裏沒有使用的任何東西。 – Jave 2012-03-01 14:27:48