
正文
Qt5.6.0+OpenGL 纹理贴图首战告捷
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效
Display.h
#ifndef DISPLAYWIDGET_H
#define DISPLAYWIDGET_H#include <QGLWidget>#include <QOpenGLFunctions>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLTexture>class DisplayGLWidget:public QGLWidget,protected QOpenGLFunctions
{
Q_OBJECT
public:
DisplayGLWidget(QWidget *parent = );
~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 <QDebug>
#include <iostream>// Create a colored triangle
static 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!
, , , // First Triangle
, , // Second Triangle
};DisplayGLWidget::DisplayGLWidget(QWidget* parent)
:QGLWidget(parent)
//: QGLWidget(QGLFormat(QGL::SampleBuffers),parent)
, m_vbo(QOpenGLBuffer::VertexBuffer)
, m_ebo(QOpenGLBuffer::IndexBuffer){ int a = ;
//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,); // 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();
m_program->enableAttributeArray();
m_program->enableAttributeArray();
m_program->setAttributeBuffer(, GL_FLOAT, , , *sizeof(GLfloat)); // 3表示的是这一个属性里面有几个分量
m_program->setAttributeBuffer(, GL_FLOAT, *sizeof(GLfloat), , *sizeof(GLfloat));
m_program->setAttributeBuffer(, GL_FLOAT, * sizeof(GLfloat), , * 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", );
texture->bind();
m_vao.bind();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDrawElements(GL_TRIANGLES,,GL_UNSIGNED_INT,);
//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 == ) // 规定屏幕高度不得低于20
{
height = ;
}
glViewport(,,(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<const char*>(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)
{}
结果:






