I am learning with opengl-tutorial.org, I’m using QT Too, When I move the mouse, the MVP matrix is updated, it works well. But the screen is not showing up the changes until I press the Alt Key. I don’t know why, is it an issue of QT or OpenGL?
InitGL Function:
programId = this->createPorgram(":/glsl/VertexShader.glsl",":/glsl/FragmentShader.glsl");
if(programId==-1){
emit blewUpApplication();
return;
}
glClearColor(0.0,0.0,0.0,1.0);
glEnable(GL_CULL_FACE);
glEnable(GL_MULTISAMPLE); // Enables multisampling for a better look
//glEnable(GL_BLEND); // Enable textures with alpha channel and alpha channels colors
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
// Bla bla bla, the rest does not matters.
PaintGL Function:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clears the screen and paint the bg with the color specified on glClearColor
float currT = float(tmr.elapsed() / 1000.0f);
if((currT-lastTime)>=1.0f){
lastTime+=1.0f;
}
deltaTime = (float)(currT-lastTime);
glm::mat4 Project = this->getMatrixProjection();
glm::mat4 View = this->getMatrixView();
glm::mat4 Model = glm::mat4(1.0f);
glm::mat4 MVP = Project * View * Model;
glUseProgram(programId);
GLuint MatrixId = glGetUniformLocation(programId,"MVP");
glUniformMatrix4fv(MatrixId,1,GL_FALSE,glm::value_ptr(MVP));
glActiveTexture(cursor_texture);
glBindTexture(GL_TEXTURE_2D,cursor_texture);
glUniform1i(glGetUniformLocation(programId,"textura"),cursor_texture);
// Draw or triangles
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[0]);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[1]);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,(void*)0);
glDrawArrays(GL_TRIANGLES,0,12*3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
Mouse Move Function:
mousepos[0] = evt->x();
mousepos[1] = evt->y();
horzAn += mouseSpeed * deltaTime * float(this->width()/2 - mousepos[0]);
vertAn += mouseSpeed * deltaTime * float(this->height()/2 - mousepos[1]);
CmDirect = glm::vec3(cos(horzAn) * sin(vertAn), sin(vertAn), cos(horzAn) * cos(vertAn));
glm::vec3 RgtVc = glm::vec3(sin(horzAn - 3.14f/2.0f),0,cos(horzAn - 3.14f/2.0f));
UpVc = glm::cross(RgtVc,CmDirect);
Proj = glm::perspective(Zoom,4.0f/3.0f,0.1f,100.0f);
Vw = glm::lookAt(PosCm,PosCm+CmDirect,UpVc);
this->cursor().setPos(suppose_x,suppose_y);
Shaders:
// Fragment
#version 330 core
out vec3 color;
in vec2 thcoord;
in vec2 UV;
uniform sampler2D d_textura;
void main(){
color = texture(d_textura,thcoord).rgb;
}
// Vertex
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 tcoord;
out vec2 thcoord;
uniform mat4 MVP;
void main(){
vec4 v = vec4(vertexPosition_modelspace,1);
thcoord=tcoord;
gl_Position = MVP * v;
}
I know that the matrix operation is working good because the effects change when I press the alt key (only one time happens).
You should add update request to the end of your mouseMoveEvent handler for Qt to know that widget needs repaint. update() or repaint() should do the trick.