6

アプリケーションからシェーダーの目の位置を更新しようとしていますが、これを試みるとエラー 1281 が発生し続けます。その後、値を更新しようとすると、初期化後に問題はありません。これが私のコードです:

void GraphicsObject::SendShadersDDS(char vertFile [], char fragFile [], char filename []) {

            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       

}

変数を更新するいくつかの方法を試しましたが、これが最新の化身です。ご覧いただきありがとうございます。すべてのコメントを歓迎します。

更新: エラーは実際にはここではまったく発生していません。エラーが発生したと仮定したのは私のせいです。実際には、いくつかのスプリングを描画するとエラーが発生します。

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

        springs[i].Draw();

}

最初のものを描画すると問題ありませんが、glBegin(GL_LINE_STRIP) に応答して glEnd() を呼び出す時点で 2 番目のものを呼び出すとエラーが発生します。私が投稿したエラーではなかったので、ご不便をおかけして申し訳ありませんが、少なくとも、ユニフォーム変数を更新する方法を知りたい場合は、こちらをご覧ください。

4

1 に答える 1

4

これは、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 を返します...したがって、取得している正確なエラーに大きく依存します...

于 2010-03-25T09:38:36.323 に答える