博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt5.6.0+OpenGL 纹理贴图首战告捷
阅读量:4652 次
发布时间:2019-06-09

本文共 6918 字,大约阅读时间需要 23 分钟。

重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效

 

Display.h

#ifndef DISPLAYWIDGET_H#define DISPLAYWIDGET_H#include 
#include
#include
#include
#include
#include
#include
class DisplayGLWidget:public QGLWidget,protected QOpenGLFunctions{ Q_OBJECTpublic: DisplayGLWidget(QWidget *parent = 0); ~DisplayGLWidget(); void teardownGL();public slots: //void CompileAndLinkVertexShader(const QString& shaderText); //void CompileAndLinkFragmentShader(const QString& shaderText); protected: void initializeGL() ; void paintGL() ; void resizeGL(int width, int height) ; //void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;private: QOpenGLBuffer m_vbo; QOpenGLBuffer m_ebo; QOpenGLVertexArrayObject m_vao; QOpenGLShaderProgram *m_program; QOpenGLTexture *texture; void printVersionInformation(); void initTextures();};#endif

 

Display.cpp

#include "DisplayGLWidget.h"#include "Vertex.h"#include 
#include
// Create a colored trianglestatic const Vertex sg_vertexes[] = { Vertex( QVector3D( 0.00f, 0.75f, 1.0f), QVector3D(1.0f, 0.0f, 0.0f) ), Vertex( QVector3D( 0.75f, -0.75f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f) ), Vertex( QVector3D(-0.75f, -0.75f, 1.0f), QVector3D(0.0f, 0.0f, 1.0f) )};static const GLfloat vertices[] = { // Positions // Colors // Texture Coords 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Top Right 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Bottom Right -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom Left -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // Top Left};static const GLfloat vertices1[] = {-0.5f, 0.5f, 0.0f, // Top Left-0.5f,0.0f, 0.0f,0.0f, 0.5f, 0.0f};static const GLuint indices[] = { // Note that we start from 0!0, 1, 3, // First Triangle1, 2, 3 // Second Triangle};DisplayGLWidget::DisplayGLWidget(QWidget* parent) :QGLWidget(parent) //: QGLWidget(QGLFormat(QGL::SampleBuffers),parent) , m_vbo(QOpenGLBuffer::VertexBuffer) , m_ebo(QOpenGLBuffer::IndexBuffer) { int a = 1; //timer.start();}DisplayGLWidget::~DisplayGLWidget(){ makeCurrent(); teardownGL();}void DisplayGLWidget::teardownGL(){ // Actually destroy our OpenGL information m_vbo.destroy(); m_ebo.destroy(); m_vao.destroy(); delete m_program;}void DisplayGLWidget::initializeGL(){ //glShadeModel(GL_SMOOTH); // 启用阴影光滑 //glClearColor(0.2,0.2,0.2,0); // 设置清除屏幕的颜色 //glClearDepth(1.0); // 设置深度缓存 //glEnable(GL_DEPTH_TEST); // 深度测试 //glDepthFunc(GL_LEQUAL); // 启用深度测试 //glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // 进行最好的透视修正,可能会影响性能 initializeOpenGLFunctions(); printVersionInformation(); glClearColor(0.3,0.3,0.3,0); // Application-specific initialization { // Create Shader (Do not release until VAO is created) m_program = new QOpenGLShaderProgram(); m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "./shaders/simple.vert"); m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "./shaders/simple.frag"); m_program->link(); m_program->bind(); // Create Vertex Array Object m_vao.create(); m_vao.bind(); // Create Buffer (Do not release until VAO is created) m_vbo.create(); m_vbo.bind(); m_vbo.setUsagePattern(QOpenGLBuffer::StaticDraw); m_vbo.allocate(vertices, sizeof(vertices)); m_ebo.create(); m_ebo.bind(); m_ebo.setUsagePattern(QOpenGLBuffer::StaticDraw); m_ebo.allocate(indices,sizeof(indices)); m_program->enableAttributeArray(0); m_program->enableAttributeArray(1); m_program->enableAttributeArray(2); m_program->setAttributeBuffer(0, GL_FLOAT, 0, 3 , 8*sizeof(GLfloat)); // 3表示的是这一个属性里面有几个分量 m_program->setAttributeBuffer(1, GL_FLOAT, 3*sizeof(GLfloat), 3, 8*sizeof(GLfloat)); m_program->setAttributeBuffer(2, GL_FLOAT, 6 * sizeof(GLfloat), 2, 8 * sizeof(GLfloat)); initTextures(); // Release (unbind) all m_vbo.release(); m_vao.release(); //m_ebo.release(); m_program->release(); } }void DisplayGLWidget::paintGL(){ //makeCurrent(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存 //glLoadIdentity(); // 重置当前模型的观察矩阵 // Render using our shader m_program->bind(); { m_program->setUniformValue("ourTexture", 0); texture->bind(); m_vao.bind(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0); //glDrawArrays(GL_TRIANGLES, 0, sizeof(sg_vertexes) / sizeof(sg_vertexes[0])); //glDrawArrays(GL_TRIANGLES, 0, 3); m_vao.release(); } m_program->release(); /*m_program1->bind(); { m_vao1.bind(); glDrawArrays(GL_TRIANGLES,0,3); m_vao1.release(); } m_program1->release();*/}void DisplayGLWidget::resizeGL(int width, int height){ if (height == 0) // 规定屏幕高度不得低于20 { height = 20; } glViewport(0,0,(GLint)width,(GLint)height); // 重置当前的视口 glMatrixMode(GL_PROJECTION); // 选择投影矩阵 glLoadIdentity(); // 重置投影矩阵 //gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0); // 建立透视投影矩阵 glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵 glLoadIdentity(); // 重置模型观察矩阵}//void DisplayGLWidget::keyPressEvent(QKeyEvent* e)//{// switch (e->key())// {// default:// break;// }//}void DisplayGLWidget::mouseMoveEvent(QMouseEvent* event){ }void DisplayGLWidget::printVersionInformation(){ QString glType; QString glVersion; QString glProfile; // Get Version Information //glType = (context()->isOpenGLES()) ? "OpenGL ES" : "OpenGL"; glVersion = reinterpret_cast
(glGetString(GL_VERSION)); // Get Profile Information#define CASE(c) case QSurfaceFormat::c: glProfile = #c; break switch (format().profile()) { CASE(NoProfile); CASE(CoreProfile); CASE(CompatibilityProfile); }#undef CASE // qPrintable() will print our QString w/o quotes around it. //qDebug() << qPrintable(glType) << qPrintable(glVersion) << "(" << qPrintable(glProfile) << ")"; qDebug() << qPrintable(glVersion) << "(" << qPrintable(glProfile) << ")";}void DisplayGLWidget::initTextures(){ texture = new QOpenGLTexture(QImage("./resources/texture/flower.jpg").mirrored()); texture->setMinificationFilter(QOpenGLTexture::Nearest); texture->setMagnificationFilter(QOpenGLTexture::Linear); texture->setWrapMode(QOpenGLTexture::Repeat);}void DisplayGLWidget::mousePressEvent(QMouseEvent* event){ }

 

 

结果:

 

转载于:https://www.cnblogs.com/zhsuiy/p/5232815.html

你可能感兴趣的文章
js 判断浏览器和ie版本号 收集
查看>>
TextView显示表情图像和文字
查看>>
密码保护
查看>>
db2字段修改
查看>>
Linux下执行可执行文件
查看>>
堆排序
查看>>
C#异常处理-什么是异常
查看>>
SVN版本管理器入门使用教程
查看>>
产生随机数
查看>>
C#语言使用习惯
查看>>
设计模式总结篇系列:装饰器模式(Decorator)
查看>>
奥东......C# 的我经历过的那些事情
查看>>
奥东......NGUI 小技巧汇总
查看>>
java反射(Field的应用)
查看>>
主流浏览器与内核
查看>>
js中常见的一些兼容性问题
查看>>
BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
查看>>
Java报错--Unsupported major.minor version 52.0
查看>>
PHP之音乐ID3扩展
查看>>
javasctipt string对象 array对象总结
查看>>