2011-07-12 10 views
6

Tengo tres atributos GLSL en mi sombreado de vérticesOpenGL atributo de sombreado no puede obligar

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

que im unión usando

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

Sin embargo, estoy recibiendo un error

No se pudo encontrar el atributo del sombreador de vértices 'Normal' para que coincida con la solicitud BindAttributeLocation.

¿Por qué no puede encontrar los atributos Posición y UV pero no el atributo Normal?

Cualquier ayuda sería muy apreciada ya que estoy bastante confundido.

Saludos

Editar: que tienen el mismo problema en Android OpenGLES20. Voy a añadir código de ejemplo: el resto de la clase es el tutorial oficial 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

Debo añadir que he probado el sombreador para asegurarme de que las modificaciones funcionen correctamente, pero todavía no puedo enlazar el atributo Normal – user346443

+0

¿De dónde obtienes este error? – kvark

+0

Debo señalar que tengo exactamente el mismo problema "a veces" en Android OpenGLES20. Tome el tutorial, agregue un "normal", "aNormal", "norma", "lo que sea" al código de sombreador de muestra, intente enlazarlo justo después y se bloquea. –

Respuesta

0

¿Seguro que está pasando el índice correcto para el shader? Usted podría intentar conseguir el índice llamando

glGetAttribLocation(program,"Normal"); 
+3

Puede pasar el índice que desee * antes * de vincular. O puede solicitar un índice (autoasignado) * después de * vincular. No hay un "índice correcto". – kvark

15

¿Está utilizando el normal en el shader o de lo contrario puede ser optimizado por el compilador GLSL. Si es otra cosa, muéstranos tus sombreadores

+1

por lo que vale la pena es la respuesta correcta al problema de Android que mencioné. Gracias Rickard. –

+1

Esto parece ser la respuesta obvia, y ser aceptada, ya que el atributo no se usa en el sombreador y la optimización de los atributos inactivos/uniformes de distancia es un comportamiento bastante común. –

+2

Esto fue todo, para mí. – bobobobo

Cuestiones relacionadas