在QT环境下用OpenGL绘制一个边长为5的立方体,并为立方体贴上自定义纹理。写出实现该功能的具体

在QT环境下用OpenGL绘制一个边长为5的立方体,并为立方体贴上自定义纹理。写出实现该功能的具体,第1张

void MyGLWidget::loadGLTexture()

{

QImage image(":/dog.jpg")

image = image.convertToFormat(QImage::Format_RGB888)

image = image.mirrored()

glGenTextures(1, &mTexture[0])

glBindTexture(GL_TEXTURE_2D,mTexture[0])

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,

image.width(), image.height(), 0,

GL_RGB, GL_UNSIGNED_BYTE,

image.bits())

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

}

void MyGLWidget::paintGL()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) // 清除屏幕和深度缓存

glLoadIdentity() // 重置当前的模型观察矩阵

glTranslatef(0.0f,0.0f,-5.0f) // 移入屏幕 5 个单位

//下面三行使立方体绕X、Y、Z轴旋转。旋转多少依赖于变量 xrot , yrot 和 zrot 的值。

glRotatef(mXRotate,1.0f,0.0f,0.0f) // X轴旋转

glRotatef(mYRotate,0.0f,1.0f,0.0f) // Y轴旋转

glRotatef(mZRotate,0.0f,0.0f,1.0f) // Z轴旋转

//下一行代码选择我们使用的纹理

//如果您在您的场景中使用多个纹理,您应该使用来 glBindTexture(GL_TEXTURE_2D, texture[ 所使用纹理对应的数字 ]) 选择要绑定的

//纹理。当您想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理,必须在 glBegin()

//之前或 glEnd() 之后绑定。注意我们在后面是如何使用 glBindTexture 来指定和绑定纹理的。

glBindTexture(GL_TEXTURE_2D, mTexture[0]) // 选择纹理

//为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,

//纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。

//如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。

//glTexCoord2f 的第一个参数是X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧。

//glTexCoord2f 的第二个参数是Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部。

//所以纹理的左上坐标是 X:0.0f,Y:1.0f ,四边形的左上顶点是 X: -1.0f,Y:1.0f 。其余三点依此类推。

//试着玩玩 glTexCoord2f X, Y坐标参数。把 1.0f 改为 0.5f 将只显示纹理的左半部分,把 0.0f 改为 0.5f 将只显示纹理的右半部分。

glBegin(GL_QUADS)

// 前面

glTexCoord2f(0.0f, 0.0f)glVertex3f(-1.0f, -1.0f, 1.0f) // 纹理和四边形的左下

glTexCoord2f(1.0f, 0.0f)glVertex3f( 1.0f, -1.0f, 1.0f) // 纹理和四边形的右下

glTexCoord2f(1.0f, 1.0f)glVertex3f( 1.0f, 1.0f, 1.0f) // 纹理和四边形的右上

glTexCoord2f(0.0f, 1.0f)glVertex3f(-1.0f, 1.0f, 1.0f) // 纹理和四边形的左上

// 后面

glTexCoord2f(1.0f, 0.0f)glVertex3f(-1.0f, -1.0f, -1.0f) // 纹理和四边形的右下

glTexCoord2f(1.0f, 1.0f)glVertex3f(-1.0f, 1.0f, -1.0f) // 纹理和四边形的右上

glTexCoord2f(0.0f, 1.0f)glVertex3f( 1.0f, 1.0f, -1.0f) // 纹理和四边形的左上

glTexCoord2f(0.0f, 0.0f)glVertex3f( 1.0f, -1.0f, -1.0f) // 纹理和四边形的左下

// 顶面

glTexCoord2f(0.0f, 1.0f)glVertex3f(-1.0f, 1.0f, -1.0f) // 纹理和四边形的左上

glTexCoord2f(0.0f, 0.0f)glVertex3f(-1.0f, 1.0f, 1.0f) // 纹理和四边形的左下

glTexCoord2f(1.0f, 0.0f)glVertex3f( 1.0f, 1.0f, 1.0f) // 纹理和四边形的右下

glTexCoord2f(1.0f, 1.0f)glVertex3f( 1.0f, 1.0f, -1.0f) // 纹理和四边形的右上

// 底面

glTexCoord2f(1.0f, 1.0f)glVertex3f(-1.0f, -1.0f, -1.0f) // 纹理和四边形的右上

glTexCoord2f(0.0f, 1.0f)glVertex3f( 1.0f, -1.0f, -1.0f) // 纹理和四边形的左上

glTexCoord2f(0.0f, 0.0f)glVertex3f( 1.0f, -1.0f, 1.0f) // 纹理和四边形的左下

glTexCoord2f(1.0f, 0.0f)glVertex3f(-1.0f, -1.0f, 1.0f) // 纹理和四边形的右下

// 右面

glTexCoord2f(1.0f, 0.0f)glVertex3f( 1.0f, -1.0f, -1.0f) // 纹理和四边形的右下

glTexCoord2f(1.0f, 1.0f)glVertex3f( 1.0f, 1.0f, -1.0f) // 纹理和四边形的右上

glTexCoord2f(0.0f, 1.0f)glVertex3f( 1.0f, 1.0f, 1.0f) // 纹理和四边形的左上

glTexCoord2f(0.0f, 0.0f)glVertex3f( 1.0f, -1.0f, 1.0f) // 纹理和四边形的左下

// 左面

glTexCoord2f(0.0f, 0.0f)glVertex3f(-1.0f, -1.0f, -1.0f) // 纹理和四边形的左下

glTexCoord2f(1.0f, 0.0f)glVertex3f(-1.0f, -1.0f, 1.0f) // 纹理和四边形的右下

glTexCoord2f(1.0f, 1.0f)glVertex3f(-1.0f, 1.0f, 1.0f) // 纹理和四边形的右上

glTexCoord2f(0.0f, 1.0f)glVertex3f(-1.0f, 1.0f, -1.0f) // 纹理和四边形的左上

glEnd()

}

void MyGLWidget::timerEvent(QTimerEvent *event)

{

//现在增加 xrot , yrot 和 zrot 的值。尝试变化每次各变量的改变值来调节立方体的旋转速度,或改变+/-号来调节立方体的旋转方向。

mXRotate += 0.3f // X 轴旋转

mYRotate += 0.2f // Y 轴旋转

mZRotate += 0.4f // Z 轴旋转

updateGL()

QGLWidget::timerEvent(event)

}

void MyGLWidget::keyPressEvent(QKeyEvent *event)

{

switch (event->key()) {

case Qt::Key_F2:

{

mFullScreen = !mFullScreen

if(mFullScreen) {

showFullScreen()

}

else {

showNormal()

}

updateGL()

break

}

case Qt::Key_Escape:

{

qApp->exit()

break

}

}

}

#include "myglwidget.h"

#include <QApplication>

int main(int argc, char *argv[])

{

QApplication a(argc, argv)

MyGLWidget w

w.show()

return a.exec()

————————————————

版权声

您问的是qt纹理如何缓存吧。qt纹理缓存步骤。

1、Android侧创建SurfaceTexture,通过FlutterJNI注册到Flutterengine里,最后返回textureid给Flutter应用层,应用层使用TextureWidget和textueid去显示图片纹理。

2、纹理数据则是在Android侧,通过OpenGL将图片纹理写入到SurfaceTexture,然后通过Flutterengine里的共享内存,将纹理数据传入到应用层,最终交给Skia渲染。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11420015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存