2011-07-12 152 views
6

我有三個GLSL在我的頂點着色器OpenGL着色着的綁定屬性

attribute highp vec4 Position; 
attribute mediump vec4 UV; 
attribute mediump vec3 Normal; 

,即時通訊使用

glBindAttribLocation(program, 0, "Position"); 
glBindAttribLocation(program, 1, "Normal"); 
glBindAttribLocation(program, 2, "UV"); 

但是綁定屬性,我得到一個錯誤

找不到頂點着色器屬性'Normal'以匹配BindAttributeLocation請求。

爲什麼它可以找到Position和UV屬性,但不是Normal屬性。

任何幫助將不勝感激,因爲我很困惑。

乾杯

編輯: 我已經在Android OpenGLES20同樣的問題。 我會添加代碼示例:該類的其餘部分是官方GLSurfaceView教程

public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { 

    String mVertexShader = "uniform mat4 uMVPMatrix;\n " + 
      "attribute vec4 aPosition;\n " + 
      "attribute vec4 aNormal; \n " + //this is the line I added 
      "attribute vec2 aTextureCoord;\n " + 
      "varying vec2 vTextureCoord;\n " + 
      "void main() {\n " + 
      "gl_Position = uMVPMatrix * aPosition;\n" + 
      " vTextureCoord = aTextureCoord;\n" + 
      "}\n"; 

    mProgram = createProgram(mVertexShader, mFragmentShader); // cf tutorial 
    if (mProgram == 0) { 
     return; 
    } 
    initShaderHandles(); //initializes the rest of the handles (cf tutorial) 

    // my little additional code 
    int maNormalHandle = GLES20.glGetAttribLocation(mProgram, "aNormal"); 
    Log.d("ATTRIB LOCATION Normal: ", maNormalHandle + ""); 
    checkGlError("glGetAttribLocation normal"); 
    if (maNormalHandle == -1) { 
     throw new RuntimeException(
       "Could not get attrib location for normal"); 
    } 
    // ...and we crash. 

} 
+0

我應該補充說明我測試了着色器以確保修改正常,但仍然無法綁定Normal屬性 – user346443

+0

從哪裏得到此錯誤? – kvark

+0

我應該指出,我在Android OpenGLES20上「有時」出現了完全相同的問題。參加教程,向示例着色器代碼添加「正常」,「正常」,「標準」,「任何」,嘗試在之後綁定它並崩潰。 –

回答

0

你確定要傳遞正確的索引着色器? 您可以嘗試通過您使用的是正常的着色器,否則它可以通過GLSL,編譯器優化了通話

glGetAttribLocation(program,"Normal"); 
+3

在鏈接之前,您可以傳遞任何您想要的索引*。或者你可以在*鏈接之後請求一個(自動分配的)索引*。沒有「正確的指數」。 – kvark

15

獲得指標。如果是其他內容,請向我們展示着色器

+1

它值得這是我提到的android問題的正確答案。感謝Rickard。 –

+1

這似乎是明顯的,並被接受,答案,因爲該屬性未在着色器中使用,並優化不活動的attibutes/uniforms是非常普遍的行爲。 –

+2

就是這樣,對我來說。 – bobobobo