Как обновить единую переменную в GLSL - PullRequest
6 голосов
/ 25 марта 2010

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

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

            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       

}

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

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

для (int i = 0; i <2; i ++) {</p>

        springs[i].Draw();

}

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

1 Ответ

4 голосов
/ 25 марта 2010

Скорее всего, это связано с тем, что 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 ... Так что многое зависит от того, какую именно ошибку вы получаете ...

...