2012-12-05 37 views
0

我正在学习opengl-tutorial.org,我使用的是QT Too,当我移动鼠标时,MVP矩阵被更新,它运行良好。但是,按下Alt键之前,屏幕并未显示更改。我不知道为什么,这是QT还是OpenGL的问题?OpenGL - QT:鼠标移动事件效果没有显示

InitGL功能:

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功能:

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

鼠标移动功能:

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

着色器:

// 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; 
} 

我知道,矩阵运算工作好,因为效果改变,当我按下Alt键(仅一次发生)。

+0

是否有处理alt按键的代码?或者它只是随机的Alt键? – Xymostech

+0

我不知道,我只是运行应用程序,我没有在应用程序的任何部分编写一个alt键事件。 alt键并不重要,更重要的是为什么不采取更新MVP矩阵的效果。 – Spamdark

+0

OT:这是Qt(一个C++框架),而不是QT(QuickTime)。 – herophuong

回答

2

您应该将更新请求添加到您的mouseMoveEvent处理程序的末尾,以便知道该小部件需要重绘。更新()或repaint()应该做的伎俩。

+0

非常感谢你=) – Spamdark