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

0

2个回答

1
w774937253
Calarence 我也用这篇文章尝试了,没有出现图片。我是Qt5.7
接近 2 年之前 回复
lzg0610210238
lzg0610210238 这篇文章有看过,没有发现什么特别的。
接近 2 年之前 回复

楼主,你解决了吗?3085259894 我的QQ,一起交流下

0
lzg0610210238
lzg0610210238 可能是QT框架的问题,重新调用QOpenglWidget中initializeGL()函数就OK。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
opengl中对于glLookAt()和glOrtho()两个函数的理解
glLookAt()是摄像机的位置,glOrtho()是将当前的可视空间设置为正投影空间。  glOrtho(-1,1,-1,1,-3,3); ...  gluLookAt(0,0,2.9,0,0,0,0,1,0);  glColor3f( 1.0, 0.0, 0.0 ); glViewport( 0, 0, 400, 400 ); glBegin( GL_LINES );
qt + opengl 绘制地球
方法: 先载入纹理图(pLoadTex函数); 再画建立一个二次曲面物体(gluNewQuadric函数),并利用函数gluQuadricTexture声明这个二次曲面可以贴纹理; 在paintGL函数里,只要调用glBindTexture和gluSphere函数,即可绘制地球。 代码: pro文件: #-----------------------------------------
学习使用MFC绘制出表格
学习使用MFC绘制出表格学习使用MFC绘制出表格学习使用MFC绘制出表格
(glut)应用arcball原理实现鼠标左键控制物体旋转(2)
百度云:vs2008工程https://pan.baidu.com/s/1eTdx4J4密码sf9w 测试发现,还是NEHE的鼠标旋转物体效果好啊,但NEHE是在基于Windows 的程序框架下编写的,不少代码融入到了windows编程中,感觉比较混乱,所以就想提取出来,在基于控制台的框架下实现出来,在此框架下代码结构比较简单,便于以后再使用这些代码,也就是便于代码复用。 按住左键旋转三维
OpenGL编程(五)绘直线以及分析绘直线的算法
这次主要实现在窗口上绘制点、线以及修改其属性,另外还会分析画直线的原理和相关算法。1、在窗口指定位置画点 glBegin(GL_POINTS); glEnd(); 使用glBegin()和glEnd()方法向窗口中添加图形。要添加点时,glBegin()函数里的参数填GL_POINTS。然后通过glVertex3f()函数在指定的(坐标)位置画点,如:glVertex3
vs2013使用QT自带的openGL
1 新建QT项目2 勾选QT GUI的OpenGL3 选择Form File 添加新类4 添加QT5Class5 命名方式如下,注意选择下面的文件6 头文件和cpp文件重写如下:#ifndef MY_QOPENGLWIDGET_H #define MY_QOPENGLWIDGET_H #include <QOpenGLWidget> #include <QOpenGLFunctions> clas
OpenGL+Qt界面(四) 纹理贴图
开发环境 结果 实现步骤 具体实现与代码 增加QOpenGLTexture指针 添加纹理图片实例化指针 修改shader 调用shder 参考开发环境vs2015 +qt5结果使用Qt中自带的QOpenGLTexture 类来实现
在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程
在Qt5.4的Example中,有一个例子qopenglwidget,介绍了QOpenGLWidget和QPainter,但是在使用过程中,需要注意哪些方面呢?我在最初使用的时候就遇到两者不能同时使用的问题,经过一番折腾,终于解决了该问题。下面,我将需要注意的点记录下来,以便查询。 第一种方法,也就是直接QOpenGLWidget的paintGL函数中绘制两者,其步骤为: QPainter p
opengl中在QWidget中添加工具栏和右键菜单——学习总结
/********************************************************************** * * 工具栏、右键菜单 的实现 * **********************************************************************/ void GGLView::initToolBar() {
Qt5下利用freeglut实现最基本OpenGL程序(图文解释)
编程环境:         Qt5.8.0 + Windows10(64bit) + freeglut (Qt下载版本) 前言(可略过……):         最近计算机图形学作业要求编写带下拉菜单栏menu的OpenGL程序,推荐用Qt,但也可以用MFC或者其他GUI库。但是据说Qt比 其他的使用起来更简单,所以下载了Qt。         因为之前都是在VS2015下利用
opengl的glortho参数的理解以及混合注意事项
最近搞opengl,本来以为自己对glortho这个函数已经了解了,结果发现自己根本不理解。 首先,glortho函数的原型是void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)。我原先一直认为near和far指定的就是近平面和远平面的z坐标,知道今天自
计算机视觉自学之路 练习1
1、通过将图像模糊化,然后从原始图像中减去模糊图像,来实现反锐化图像掩模操作(http://en.wikipedia.org/wiki/Unsharp_masking)。反锐化图像掩模操作可以实现图像锐化效果。试在彩色和灰度图像上使用反锐化图像掩模操作,观察该操作的效果...
OpenGL实现纹理贴图,绘制两个棋盘
OpenGL红包书实例,完整代码,实现黑白棋盘绘制,一个正向,一个侧向棋盘
Qt中OpenGL窗口创建的几种形式
一、使用QOpenGLWidget: 创建一个带widget类的项目: widget.h为: #ifndef WIDGET_H #define WIDGET_H #include #include #include class Widget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT publ
QOpenglWidget 画动态矩形
    使用的都是opengl的函数,只不过Qt再封装了一遍;在使用过程中有一些注意点,需要记下。我的头文件申明如下#ifndef GLDRAWWIDGET_H #define GLDRAWWIDGET_H #include &amp;lt;QOpenGLWidget&amp;gt; #include &amp;lt;QOpenGLFunctions&amp;gt; #include &amp;lt;QOpenGLBuffer&amp;gt;...
从图片加载纹理-使用glut工具
#include #include #include #include #include static GLuint texName; AUX_RGBImageRec * CreateTextureFromBmp() { FILE *File=NULL; const char *Filename= "hehua.bmp"; File=fopen(Filename,"r");
OpenGL中投影函数glOrtho()、glFrustum()以及gluPerspective()以及函数的用法
OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果乘以投影矩阵(将3D物体投影到2D平面), 相乘后, 模型的投影方式被设置; 如果乘以纹理矩阵(), 模型的纹理方式被设置. 而用来指定乘以什么类型的矩阵, 就是glMatriMode(GLenum mode
记录Qt之QOpenGLWidget的一个BUG
QOpenGLWidget在系统睡眠唤醒后有bug
QOPenGLWidget与QPainter混合编程--绘制文本
前言:QOPenGLWidget取代了之前的QGLWidget类,用以在Qt中提供Opengl的编程接口。在QGLWidget类中,我们可以通过方法drawTexture来绘制文本。但是在QOPenGLWidget类的时候,这个方法没有提供了。官方文档给出的建议是混合QPainter使用。本文档就是介绍怎么用QPainter来在OPengl窗口上绘制2D文本 Qt使用QOpenglWidget构建一
折线法
 1.饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个地放进碗橱摞成一摞。一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式? 2.给定n个数,有多少种出栈序列? 3.一个有n个1和n个-1组成的字串,且前k个数的和均不小于0,那这种字串的总数为多少?   这三个问题具有相同的结构,三个问题是可以互相转
使用python画地理图
使用python,绘制出地理数据表示。。。。。。。。。。。
opencv-鼠标在窗口中画矩形
#include<iostream> #include <core.hpp> #include <highgui.hpp> #include<cv.h> using namespace cv; using namespace std; void my_mouse_callback( int event, int x, int y, int flags, void* param
OpenGL(二)图形绘制之多边形面的绘制
本次通过绘制一个三角形来学习相关的知识。 #include #include #include #include #include //窗口的大小 GLsizei windowWidth; GLsizei windowHeight; //旋转角度参数 static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; //确定多边形的绕
QT与OpenGL之绘图
在之前说道过VS2010中配合OpenGL绘图的问题,这回是想要说说在QT中使用OpenGL,其实两者并无太大区别,因为都是基于C++语言的。 主要是想简要介绍下OpenGL在QT中的使用方法跟一些错误。 glwidget.h  //继承自QGLWidget,用来实现OpenGL相关的操作以及绘图操作 #ifndef GLWIDGET_H #define GLWIDGET_H #inc
QT5使用OpenGL的错误
(1)gluPerspective没有定义例如:gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1,100.0 );转换为:GLfloat zNear = 0.1;GLfloat zFar = 100.0;GLfloat aspect = (GLfloat)width/(GLfloat)height;GLfloat fH = tan(...
c语言画出空心菱形
#include&amp;lt;stdio.h&amp;gt;int main(){int x=0;int y=0;/*4        *3    *       *2 *             *1    *       *0        *  0  2   4   6   8*/for(;y&amp;lt;5;y++){for(x=0;x&amp;lt;9;x+=2){if(y==2-x/2){printf(&quot;*&quot;);...
Python turtle库绘制图形
利用turtle库来实现图形绘制其实很简单,一开始看看图片是否有规律,然后按照规律进行画图. 蝰蛇:   #PythonDraw.py import turtle turtle.setup(650,350,200,200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize() turtle.pencolor(&quot;pur...
ggplot2主要部件——快速上手ggplot2
ggplot2主要部件——快速上手ggplot2 简介 R语言的ggplot2绘图真的是务必强大,学习R最好的参考书就《R语言实战》这本书。本文借鉴该书里面的例子,希望能对大家对ggplot2的使用有个直观的了解。 一、图类型 geom_XXX(…) bar条形图,boxplot箱线图,violin小提琴图,density密度图,histogram直方图, 水平线,垂线,jitter抖动点, ...
VB生物曲线计算并绘制出曲线图
VB生物曲线计算并绘制出曲线图VB生物曲线计算并绘制出曲线图
opengl中的双缓冲技术
所谓双缓冲技术,是指两个缓冲区:前台缓冲和后台缓冲。前台缓冲即我们看到的屏幕, 后台缓冲则在内存当中,对我们来说是不可见的。每次我们绘图都在后台缓冲中进行的, 当绘图完成时,就必须把绘制的最终结果复制到屏幕上。在opengl中glutSwapBuffers函数就 可以实现双缓冲技术的一个重要函数。该函数的作用就是交换两个缓冲区的指针,从而把绘制 结果图复制到屏幕上,从而使用户可见。否则在后
利用七段数码管输出当前日期及时间 && 绘制出某人的生日,并计算输出当前年龄。
原题:用七段晶体管输出当前日期及时间。 # -*- coding:utf-8 -*- import turtle import time def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(draw): #绘制单段数码管 drawGap() turtle.pendown() i...
用鼠标在窗口中绘制矩形
鼠标相应事件采用了回调函数的方式来处理。为了可以响应鼠标事件,首先创建一个回调函数,使得鼠标事件(如移动、点击等)发生时OpenCV可以调用这个函数。创建这个函数之后,还要在OpenCV中注册这个函数。
imageView不能正确显示图片
- (void)viewDidLoad {     [super viewDidLoad];     UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"welcome1"]];     image.backgroundColor = [UIColor colorWithRed:0.127 
PowerPoint图形组合
利用此文件中的图形组合可以轻松绘制出个性美观大方的ppt演示文稿
学习笔记2--与OpenGL窗口中的立方体进行简单的交互
对于任何应用程序,交互都是必须的,本文将在上一篇笔记的基础上,再添加些交互功能。 添加的交互功能是较为常见的:让OpenGL窗口中的渲染的立方体响应鼠标事件,实现对立方体的旋转、放缩、移动。 要实现以上交互功能,主要解决两个问题:一个是界面如何响应鼠标输入事件,这主要重写Qt中窗口部件的mouseMoveEvent、wheelEvent、mousePressEvent等类似的函数来实现对鼠标事
声音文件播放程序.可以播放WAV文件,并绘制出WAV文件的波形,在播放时还可以绘制出声音的频谱-voiceplayer.rar
声音文件播放程序.可以播放WAV文件,并绘制出WAV文件的波形,在播放时还可以绘制出声音的频谱-voiceplayer.rar
Qt使用opengl报错 解决方法
在pro文件中添加 LIBS += -lopengl32 看到这个文章解决的问题点击打开链接
js绘制sin曲线(波浪线)
js sin 波浪线
语音过零率matlab源代码
使用该代码,可以测出语音过零率,并绘制出其图形
MATLAB绘制图像频谱程序
MATLAB绘制图像频谱程序,可以绘制出选中图片的二维频谱图。本人使用MATLAB7.0b
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 云计算可以干什么 哪里可以学python