Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to update a uniform variable in GLSL

Tags:

c++

opengl

glsl

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 wants to know how to update uniform variables then it's here.

like image 423
paj777 Avatar asked Mar 25 '10 08:03

paj777


People also ask

What is uniform variable in GLSL?

A uniform is a global Shader variable declared with the "uniform" storage qualifier. These act as parameters that the user of a shader program can pass to that program. Their values are stored in a program object.

What is the difference between an attribute and a uniform variable?

The difference between attribute and uniform variable is that attribute variables contain data which is vertex specific so they are reloaded with a new value from the vertex buffer for each shader invocation while the value of uniform variables remains constant accross the entire draw call.

Can uniform variables be declared in a fragment shader?

Uniform variables can appear in any shader within a shader program, and are always used as input variables. They can be declared in one or more shaders within a program, but if a variable with a given name is declared in more than one shader, its type must be the same in all shaders.

How do I edit a GLSL file?

You can also open and edit GLSL files with source code editors, such as Microsoft Visual Studio Code (multiplatform). Since GLSL files are saved in plain text, you can use any text editor, such as Microsoft Notepad (bundled with Windows), Apple TextEdit (bundled with macOS), or gedit (Linux) to open and edit them.


1 Answers

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 ...

like image 100
Goz Avatar answered Oct 18 '22 09:10

Goz