This topic is 1929 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi all,

I recently discovered that the latest OpenGL standards have deprecated glTranslatef and a bunch of other immediate-mode functions.

My graphics hardware is not great (it doesn't support VAOs, for instance) but I feel I should learn the correct way of doing things.

I read these tutorials: http://www.swiftless.com/opengltuts/opengl4tuts.html and the ones at opengl-tutorial.net.

I tried to implement shaders into my code, but I just see some yellow lines...

In the initiation procedure:

      glViewport(0, 0, (GLsizei) screenSize.x, (GLsizei) screenSize.y);
projectionMatrix = glm::perspective( 75.0f, screenSize.x / screenSize.y, clip_near, clip_far);

glBindAttribLocation(programShaderID, 0, "in_Position"); // Bind a constant attribute location for positions of vertices


Drawing is done by VBOs only (my hardware doesn't support VAOs AFAIK), in the usual way as far as I can see.

Every frame, after drawing:

        int projectionMatrixLocation = glGetUniformLocation(programShaderID, "projectionMatrix"); // Get the location of our projection matrix in the shader
int viewMatrixLocation = glGetUniformLocation(programShaderID, "viewMatrix"); // Get the location of our view matrix in the shader
int modelMatrixLocation = glGetUniformLocation(programShaderID, "modelMatrix"); // Get the location of our model matrix in the shader

glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &projectionMatrix[0][0]); // Send our projection matrix to the shader
glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, &viewMatrix[0][0]); // Send our view matrix to the shader
glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, &modelMatrix[0][0]); // Send our model matrix to the shader


vertex:

#version 330 core
in vec3 in_Position;

void main(){

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition_modelspace, 1.0);
}


fragment:

#version 330 core
out vec3 color;

void main(){
color = vec3(1,0,0);
}


I can see something, but my glm::matrices are not seeming to work (i.e. the translation is NOT happening).

I'm so confused, and most of the tutorials seem to use VAOs which I can't do.

Am I doing this right?

Can I use shaders without VAOs?

Am I supposed to pass vertex to a shader, like I did with the matrices?

EDIT:

I checked, and it is only the translation which is not happening as far as I can see. Why is this?

mikey

Edited by mikenovemberoscar

##### Share on other sites

 #version 330 core
in vec3 in_Position;

void main(){

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition_modelspace, 1.0);
}

Should be
#version 330 core
in vec3 in_Position;

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

void main(){

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition_modelspace, 1.0);
}

Still, if your hardware doesn't supports VAO (exactly, what GPU do you have?) I don't think you can use GLSL 3.30 either.

##### Share on other sites

I did what you said- but nothing happened. The entire scene is rendered however no translation is being done.

I'm not sure if it makes a difference, but I noticed that you wrote:

vertexPosition_modelspace

in_Position


But whatever I change that variable to- nothing happens.

Are you sure I don't have to somehow feed each variable through the shader? Or is that automatic?

My graphics card is an "ATI Mobility Radeon HD 2400 XT". My machine is a 2011 iMac but running Boot Camped WinXP.

Edited by mikenovemberoscar

##### Share on other sites

From the looks of it, TheChubu based his answer off your sample code where you used vertexPosition_modelspace.

Try using in_Position instead because that is the correct name of the uniform.

##### Share on other sites

Yes that was probably my fault- but like I said- whatever I put there doesn't make a difference, no translations are being done. Plus- no linker errors from the shader loader are generated?

##### Share on other sites

Drawing is done by VBOs only (my hardware doesn't support VAOs AFAIK), in the usual way as far as I can see.

Every frame, after drawing:

        int projectionMatrixLocation = glGetUniformLocation(programShaderID, "projectionMatrix"); // Get the location of our projection matrix in the shader
int viewMatrixLocation = glGetUniformLocation(programShaderID, "viewMatrix"); // Get the location of our view matrix in the shader
int modelMatrixLocation = glGetUniformLocation(programShaderID, "modelMatrix"); // Get the location of our model matrix in the shader

glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &projectionMatrix[0][0]); // Send our projection matrix to the shader
glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, &viewMatrix[0][0]); // Send our view matrix to the shader
glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, &modelMatrix[0][0]); // Send our model matrix to the shader


Here is one problem,

I guess you first do something like "glUseProgram(programShaderId)", and at the end of your drawing "glUseProgram(0)"? Or do you just use one shader? Then setting it once in the initialisation is ok.
When you set the uniforms after drawing, the shaders dont have the matrices when they draw/process everything.or if the shader is active all the time then you draw everything with the matrices from the last draw step.
The right sequence would be:

Initialisation:

2. glGetUniformLocation

Each frame:

1. set uniforms

The other stuff you are doing should be right, so this sequence only considers the uniform stuff.

A good resource for me is http://www.opengl-tutorial.org/
Feel free to ask if it is still not working or when there are other questions

Best regards
Marc

##### Share on other sites

Hi Marc,

Thanks so much for your reply, it was very informative. I did what you said but it still isn't working, however I found out that my glGetUniformLocation calls are returning -1.

Why could this be?

Here's what I'm now doing:

(at startup)

loadShaders(...);
glBindAttribLocation(...);

// THESE ^^ RETURN NEGATIVE ONE!

projectionMatrix = getProjectionMatrix();

(each frame)

viewMatrix = glm::...
modelmatrix = glm::...

glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &projectionMatrix[0][0]);
glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, &viewMatrix[0][0]);
glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, &modelMatrix[0][0]);

drawModels();



Thanks :)

##### Share on other sites

Usually -1 means that you don't use them in the shader and the compiler likes to optimize them out, but that isn't probably your situation. Are you sure that the shaders compile and link nicely? Use glGetProgramInfoLog to make sure about that.

1. 1
2. 2
3. 3
Rutin
15
4. 4
5. 5

• 26
• 11
• 9
• 9
• 11
• ### Forum Statistics

• Total Topics
633701
• Total Posts
3013440
×