Атрибут шейдера OpenGL не может быть привязан - PullRequest
6 голосов
/ 12 июля 2011

у меня есть три атрибута glsl в моем вершинном шейдере

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.

}

Ответы [ 2 ]

15 голосов
/ 12 июля 2011

Используете ли вы обычный в шейдере, иначе он может быть оптимизирован компилятором glsl.Если это что-то еще, пожалуйста, покажите нам свои шейдеры

0 голосов
/ 12 июля 2011

Вы уверены, что передаете правильный индекс шейдеру?Вы можете попробовать получить индекс, позвонив по номеру

glGetAttribLocation(program,"Normal");
...