lzg0610210238 2017-08-02 07:01 采纳率: 16.7%
浏览 2238

QOpenglWidget中使用glortho无法绘制出纹理图,在glut下可以

在QOpenglWidget中绘制图形,使用glm::ortho模式进行正交投影,发现图形无法显示。如下图所示,显示的是清屏的红色。
图片说明
相同的绘制代码使用glut绘制的窗体中,可以正常显示。如下图所示。
图片说明
以下贴出核心代码,请问可能什么原因?

const GLfloat vertexVertices[] =
{
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f
};

const GLfloat textureVertices[] =
{
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
};

void HozoHorizontalDrawer::InitDrawer()
{
InitShader();//加载shader source
GenTextureArray();//创建纹理
glUniform1i(m_iYTextureUniform, 0);
SetTextureEnvInitFlag(true);

glUseProgram(m_nShaderProgram);
glGenBuffers(2, m_nBufferArray);
glBindBuffer(GL_ARRAY_BUFFER, m_nBufferArray[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexVertices), vertexVertices, GL_STATIC_DRAW);
glVertexAttribPointer(eVertex, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(eVertex);

glBindBuffer(GL_ARRAY_BUFFER, m_nBufferArray[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureVertices), textureVertices, GL_STATIC_DRAW);
glVertexAttribPointer(eTexture, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(eTexture);

}

void HozoHorizontalDrawer::Draw(float PlayerControlWidth, float PlayerControlHeight, tagTextureDescription panoramaFrame)
{
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glShadeModel(GL_SMOOTH);

glUseProgram(m_nShaderProgram);

//正交投影
m_mat4View = glm::lookAt(glm::vec3(0, 0, -1), glm::vec3(0, 0, 0), glm::vec3(0, -1, 0));
m_mat4Projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f);
m_mat4Model = glm::mat4(1.0f);
m_mat4Model = glm::translate(m_mat4Model, glm::vec3(m_fXTranslate, m_fYTranslate, m_fZTranslate));
m_mat4Model = glm::rotate(m_mat4Model, glm::radians(m_fXRotateDegree), glm::vec3(1.0f, 0, 0));
m_mat4Model = glm::rotate(m_mat4Model, glm::radians(m_fYRotateDegree), glm::vec3(0, 1.0f, 0));
m_mat4Model = glm::rotate(m_mat4Model, glm::radians(m_fZRotateDegree), glm::vec3(0, 0, 1.0f));
m_mat4Model = glm::scale(m_mat4Model, glm::vec3(m_fXScale, m_fYScale, m_fZScale));
m_mat4ProjectionModelView = m_mat4Projection * m_mat4View * m_mat4Model;
glUniformMatrix4fv(m_iProjectionModelViewIDUniform, 1, GL_FALSE, &m_mat4ProjectionModelView[0][0]);
glEnable(GL_TEXTURE_2D);
SetTexturesImages(panoramaFrame);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  
glFlush();

glUseProgram(0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);

}

对应QOpenGLWidget代码如下。
void QMyOpenGLWidget::initializeGL()
{
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void QMyOpenGLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}

void QMyOpenGLWidget::paintGL()
{
makeCurrent();
if (nullptr != m_Picture.pTextureData[0] && nullptr != m_pDrawer)
{
this->m_pDrawer->Draw(this->width(), this->height(), m_Picture);
}
}

void QMyOpenGLWidget::drawPicturepaintGL()
{
this->update();
return;
}
对应顶点着色器和片段着色器代码如下。
#version 330 core
uniform mat4 ProjectionModelView;
attribute vec4 vertexCoord;
attribute vec2 textureCoord;
varying vec2 outTextureCoord;

void main(void){
gl_Position = ProjectionModelView * vertexCoord;
outTextureCoord = textureCoord;
}

varying vec2 outTextureCoord;
uniform sampler2D textureY;

void main(void)
{
vec3 bgr;
bgr = texture2D(textureY, outTextureCoord).rgb;
gl_FragColor = vec4(bgr, 1.0);
}

  • 写回答

2条回答

  • devmiao 2017-08-02 17:09
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)