开发者

How to update a uniform variable in GLSL

开发者 https://www.devze.com 2022-12-24 10:49 出处:网络
I am trying to get update the eye position in my shader from my appliaction but I keep getting error 1281 when I attempt this. I have no problems after the initialization just when i subsequently try

I am trying to get update the eye position in my shader from my appliaction but I keep getting error 1281 when I attempt this. I have no problems after the initialization just when i subsequently try to update the values. Here is my code:

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);

}

And here's the function I call to update the eye position:

void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition){

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

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

}

I've tried a few ways now of updating the variable and this is the latest incarnation, thanks for viewing, all comments welcome.

UPDATE: The error is not actually happening here at all, my fault for assuming it was, the error actually occurs when I draw a number of spring :

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

        springs[i].Draw();

}

When I draw the first one it's fine but I get an error when calling the second at the point where call glEnd() in response to glBegin(GL_LINE_STRIP). Sorry for the inconvenience as it wasn't the error I posted but atleast if anyone开发者_StackOverflow社区 wants to know how to update uniform variables then it's here.


It is most likely this is caused by the fact that EyePos is invalid.

What happens if you change the function to the following?

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

    DWORD bob = glGetError();
}

Edit: In response to your update the docs for glBegin/glEnd say that you'll get error 1280 (GL_INVALID_ENUM) if mode is set to an unacceptable value. Thus your problem is that GL_LINE_STRIP is not supported.

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 returns error 1282 and GL_INVALID_ENUM 1280 ... So a lot depends on what exact error you are getting ...

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号