Как обновить юниформ-переменную в GLSL

Я пытаюсь обновить положение глаз в моем шейдере из своего приложения, но я продолжаю получать ошибку 1281, когда пытаюсь это сделать. У меня нет проблем после инициализации, когда я впоследствии пытаюсь обновить значения. Вот мой код:

void GraphicsObject::SendShadersDDS(char vertFile [], char fragFile [], char имя файла []) {

            char *vs = NULL,*fs = NULL;

            vert = glCreateShader(GL_VERTEX_SHADER);
            frag = glCreateShader(GL_FRAGMENT_SHADER);

            vs = textFileRead(vertFile);
            fs = textFileRead(fragFile);
            const char * ff = fs;
            const char * vv = vs;

            glShaderSource(vert, 1, &vv, NULL);
            glShaderSource(frag, 1, &ff, NULL);

            free(vs); free(fs);

            glCompileShader(vert);
            glCompileShader(frag);

            program = glCreateProgram();
            glAttachShader(program, frag);
            glAttachShader(program, vert);

            glLinkProgram(program);
            glUseProgram(program);

        LoadCubeTexture(filename, compressedTexture);

        GLint location = glGetUniformLocation(program, "tex");
        glUniform1i(location, 0);
        glActiveTexture(GL_TEXTURE0);

        EyePos = glGetUniformLocation(program, "EyePosition");

        glUniform4f(EyePos, EyePosition.X(),EyePosition.Y(), 
                                    EyePosition.Z(), 1.0);          
        DWORD bob = glGetError();
        //All is fine here
        glEnable(GL_DEPTH_TEST);

}

А вот функция, которую я вызываю для обновления положения глаза:

void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition){

glUniform4f(EyePos, eyePosition.X(),eyePosition.Y(), 
                                    eyePosition.Z(), 1.0);

DWORD bob = glGetError();
//bob equals 1281 after this call       

}

Я попробовал несколько способов обновления переменной, и это последнее воплощение, спасибо за просмотр, все комментарии приветствуются.

ОБНОВЛЕНИЕ: Ошибка на самом деле здесь вообще не происходит, я виноват в том, что это произошло, ошибка на самом деле возникает, когда я рисую число spring :

for(int i = 0; i ‹ 2; i++) {

        springs[i].Draw();

}

Когда я рисую первый, все в порядке, но я получаю сообщение об ошибке при вызове второго в точке, где вызывается glEnd() в ответ на glBegin(GL_LINE_STRIP). Извините за неудобства, так как это была не ошибка, которую я опубликовал, но, по крайней мере, если кто-то хочет знать, как обновлять юниформ-переменные, то она здесь.


person paj777    schedule 25.03.2010    source источник


Ответы (1)


Скорее всего, это вызвано тем, что EyePos недействителен.

Что произойдет, если вы измените функцию на следующую?

void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition)
{
    EyePos = glGetUniformLocation(program, "EyePosition");
    glUniform4f(EyePos, eyePosition.X(),eyePosition.Y(), eyePosition.Z(), 1.0);

    DWORD bob = glGetError();
}

Изменить: в ответ на ваше обновление документы для glBegin/glEnd говорят, что вы получите ошибку 1280 (GL_INVALID_ENUM), если для режима установлено недопустимое значение. Таким образом, ваша проблема в том, что GL_LINE_STRIP не поддерживается.

GL_INVALID_OPERATION is generated if glBegin is executed between a glBegin and the corresponding execution of glEnd.

GL_INVALID_OPERATION is generated if glEnd is executed without being preceded by a glBegin.

GL_INVALID_OPERATION is generated if a command other than glVertex, glColor, glSecondaryColor, glIndex, glNormal, glFogCoord, glTexCoord, glMultiTexCoord, glVertexAttrib, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, glEdgeFlag, glCallList, or glCallLists is executed between the execution of glBegin and the corresponding execution glEnd.

GL_INVALID_OPERATION возвращает ошибку 1282 и GL_INVALID_ENUM 1280... Так что многое зависит от того, какую именно ошибку вы получаете...

person Goz    schedule 25.03.2010
comment
Какая у вас ошибка? И возникает ли ошибка из-за glGetUniformLocation или glUniform4f? - person Goz; 25.03.2010
comment
Если я включаю glGetUniformLocation в метод, то ошибка возникает сразу после строки, но если я не включаю эту строку и использую EyePos в качестве частного члена, ошибка все равно возникает. Номер ошибки 1280 и это все что я знаю. А значение EyePos равно -1. - person paj777; 25.03.2010
comment
Что ж, если glGetUniformLocation не работает, то, вероятно, значение вашей программы неверно ИЛИ не удается найти EyePosition в программе. Также обратите внимание: 1280 — это другая ошибка, а не та, которую должна возвращать glGetUniformLocation. Если вы получите 1281, это потому, что программа недействительна. - person Goz; 25.03.2010
comment
Если бы значение моей программы было неправильным, разве я не получил бы ошибку при инициализации шейдера, а не только при вызове для обновления переменной? И не возникнет ли у него проблем с поиском EyePosition в этот момент? - person paj777; 25.03.2010
comment
Я только что заметил, что ошибка на самом деле не происходит в шейдере, и обновление работает нормально, моя глупая ошибка, я добавлю обновление в пост. - person paj777; 25.03.2010
comment
Сотрите это, похоже, это ошибка 1282, и она также возникает с GL_POINTS. - person paj777; 25.03.2010
comment
И я также заметил, что получаю ту же ошибку при использовании GL_QUADS, когда я рисую некоторые блоки. - person paj777; 25.03.2010