Sunday, February 5, 2017

Incorrect rotations using openGL GLM and shaders



The goal of my program is to display a simple colored triangle rotating on the Y axis without any translation. I'm using the GLM library. The problem is that the transformations of my triangle are not correct : it has a strange and not logical behaviour. Here's my c++ code plus the vertex shader and fragment shader code :


C++ code :


float angle = 0.0f;

struct Vertex
{

float x, y, z;
};

static Vertex vertices[9] =
{
-1.000000f, 0.000000f, 0.000000f,
0.000000f, 1.000000f, 0.000000f,
1.000000f, 0.000000f, 0.000000f
};


static Vertex colors[9] =
{
1.000000f, 0.000000f, 0.000000f,
0.000000f, 1.000000f, 0.000000f,
0.000000f, 0.000000f, 1.000000f
};

[...]

int

main(int ac, char **av)
{
bool continuer = true;
SDL_Event event;
GLuint vboID[2];
GLuint programID = 0;

//SDL window initialization

SDL_Init(SDL_INIT_VIDEO);

SDL_WM_SetCaption("VBO tests",NULL);
SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL);

//Viewport initialization

glViewport(0, 0, WIDTH, HEIGHT);

//Projection initialization

glm::mat4 projection = glm::mat4(1.0f);

projection = glm::perspective(60.0f, (float)(WIDTH/HEIGHT), 1.0f, 1000.0f);

//View initialization

glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 8.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));

glewInit();

//Shaders initialization


programID = initShaders("triangle.vert", "triangle.frag");

//Main loop

while (continuer)
{
eventListener(&event, &continuer);

glClearDepth(1.0f);
glClearColor(0.13f, 0.12f, 0.13f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(programID);

//Model transformations

glm::mat4 model = glm::mat4(1.0f);
model *= glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));
model *= glm::rotate(model, angle, glm::vec3(0.0f, 1.0f, 0.0f));


glm::mat4 ModelViewMatrix = model * view;
glm::mat4 ModelViewProjectionMatrix = projection * ModelViewMatrix;

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, colors);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

glUniformMatrix4fv(glGetUniformLocation(programID, "ModelView"), 1, GL_TRUE, glm::value_ptr(ModelViewMatrix));

glUniformMatrix4fv(glGetUniformLocation(programID, "MVP"), 1, GL_TRUE, glm::value_ptr(ModelViewProjectionMatrix));

glDrawArrays(GL_TRIANGLES, 0, 3);

glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);

glUseProgram(0);

angle += 0.020f;


glFlush();
SDL_GL_SwapBuffers();
}

SDL_Quit();
return (0);
}

Vertex shader code :



#version 330

in vec3 VertexPosition;
in vec3 VertexColor;

uniform mat4 ModelViewMatrix;
uniform mat4 MVP;

out vec3 Color;


void main()
{
Color = VertexColor;

gl_Position = MVP * vec4(VertexPosition, 1.0f);
}

Fragment shader code :

#version 330


in vec3 Color;
out vec4 FragColor;

void main() {
FragColor = vec4(Color, 1.0);
}

When I declare just a simple matrix rotation for the model, I send it to the vertex shader and I use it as MVP and it works. But when I add the projection matrix + the view matrix it does not work correctly. Normally, the triangle should be rotating at the center of the screen.The current animation shows the triangle appearing on the right of the screen and disappearing on the left side.


Does anyone can help me, please ?



Thanks in advance for your help.



Answer



Just set 'the view matrix' to identity and then translate to like -6.0 on the z axis.


You are not using lookAt() correctly. The first paramater is the position you are at (the camera) and the second is where you look at.


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...