日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt学习笔记-OpenGL做正方体并旋转

發(fā)布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt学习笔记-OpenGL做正方体并旋转 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

運行截圖如下圖:



代碼如下:

myglwidget.h

#ifndef MYGLWIDGET_H #define MYGLWIDGET_H#include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLBuffer>class QOpenGLTexture; class QOpenGLShaderProgram;class MyGLWidget:public QOpenGLWidget,protected QOpenGLFunctions {Q_OBJECT public:MyGLWidget(QWidget *parent=0);protected:void initializeGL();void paintGL();void resizeGL(int w, int h);void keyPressEvent(QKeyEvent *evnet);private:QOpenGLShaderProgram *program;QOpenGLBuffer vbo;QOpenGLTexture *textures[6];GLfloat translate,xRot,yRot,zRot; };#endif // MYGLWIDGET_H


myglwidget.cpp

#include "myglwidget.h" #include <QOpenGLShaderProgram> #include <QOpenGLTexture> #include <QDebug> #include <QKeyEvent>MyGLWidget::MyGLWidget(QWidget *parent):QOpenGLWidget(parent) {translate = -6.0;xRot = zRot = 0.0;yRot = -30.0; }void MyGLWidget::initializeGL(){initializeOpenGLFunctions();glEnable(GL_DEPTH_TEST);for(int i=0; i<6; ++i){textures[i] = new QOpenGLTexture(QImage(QString(":/img/side%1.png").arg(i+1)).mirrored());}QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex,this);const char *vsrc ="#version 130\n""in vec4 vPosition; \n""in vec2 vTexCoord; \n""out vec2 texCoord; \n""uniform mat4 matrix; \n""void main() { \n"" texCoord = vTexCoord; \n"" gl_Position = matrix * vPosition; \n""}\n";vshader->compileSourceCode(vsrc);QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment,this);const char *fsrc ="#version 130\n""uniform sampler2D tex; \n""in vec2 texCoord; \n""out vec4 fColor; \n""void main() { \n"" fColor = texture(tex, texCoord); \n""}\n";fshader->compileSourceCode(fsrc);program = new QOpenGLShaderProgram;program->addShader(vshader);program->addShader(fshader);program->link();program->bind(); }void MyGLWidget::paintGL(){int w = width();int h = height();int side = qMin(w,h);glViewport((w-side)/2,(h-side)/2,side,side);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);GLfloat vectices[6][4][3]={{{1.0f,1.0f,1.0f},{1.0f,1.0f,-1.0f},{1.0f,-1.0f,-1.0f},{1.0f,-1.0f,1.0f}},{{-1.0f,1.0f,1.0f},{-1.0f,1.0f,-1.0f},{-1.0f,-1.0f,-1.0f},{-1.0f,-1.0f,1.0f}},{{1.0f,1.0f,1.0f},{-1.0f,1.0f,1.0f},{-1.0f,1.0f,-1.0f},{1.0f,1.0f,-1.0f}},{{1.0f,-1.0f,1.0f},{-1.0f,-1.0f,1.0f},{-1.0f,-1.0f,-1.0f},{1.0f,-1.0f,-1.0f}},{{1.0f,1.0f,1.0f},{1.0f,-1.0f,1.0f},{-1.0f,-1.0f,1.0f},{-1.0f,1.0f,1.0f}},{{1.0f,1.0f,-1.0f},{1.0f,-1.0f,-1.0f},{-1.0f,-1.0f,-1.0f},{-1.0f,1.0f,-1.0f}},};GLfloat coords[6][4][2] ={{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },};vbo.create();vbo.bind();vbo.allocate((72+48)*sizeof(GLfloat));vbo.write(0,vectices,72*sizeof(GLfloat));GLuint vPosition = program->attributeLocation("vPosition");program->setAttributeBuffer(vPosition,GL_FLOAT,0,3,0);glEnableVertexAttribArray(vPosition);vbo.write(72* sizeof(GLfloat), coords, 48*sizeof(GLfloat));GLuint vTexCoord = program->attributeLocation("vTexCoord");program->setAttributeBuffer(vTexCoord, GL_FLOAT, 72* sizeof(GLfloat), 2, 0);glEnableVertexAttribArray(vTexCoord);program->setUniformValue("tex", 0);QMatrix4x4 matrix;matrix.perspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f);matrix.translate(0, 0, translate);matrix.rotate(xRot, 1, 0, 0);matrix.rotate(yRot, 0, 1, 0);matrix.rotate(zRot, 0, 0, 1);program->setUniformValue("matrix",matrix);for(int i=0; i<6; i++) {textures[i]->bind();glDrawArrays(GL_TRIANGLE_FAN, i*4, 4);} }void MyGLWidget::resizeGL(int w, int h){}void MyGLWidget::keyPressEvent(QKeyEvent *event) {switch (event->key()) {case Qt::Key_Up:xRot += 10;break;case Qt::Key_Left:yRot += 10;break;case Qt::Key_Right:zRot += 10;break;case Qt::Key_Down:translate -= 1;break;case Qt::Key_Space:translate += 1;break;default:break;}update();QOpenGLWidget::keyPressEvent(event); }


main.cpp

#include <QApplication> #include "myglwidget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);MyGLWidget w;w.resize(800,600);w.show();return a.exec(); }

總結(jié)

以上是生活随笔為你收集整理的Qt学习笔记-OpenGL做正方体并旋转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。