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

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

пустой GraphicsObject:: SendShadersDDS (символ vertFile [], символ 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);

}

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

пустой GraphicsObject:: UpdateEyePosition (Vector3d& eyePosition) {

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

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

}

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

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

для (интервал i = 0; я <2; я ++) {

        springs[i].Draw();

}

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

6
задан paj777 25 March 2010 в 11:39
поделиться

1 ответ

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

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

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

    DWORD bob = glGetError();
}

Edit: В ответ на ваше обновление в документации для glBegin/glEnd сказано, что вы получите ошибку 1280 (GL_INVALID_ENUM), если mode установлен в недопустимое значение. Таким образом, ваша проблема заключается в том, что 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 ... Так что многое зависит от того, какую именно ошибку вы получаете ...

4
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: