{
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渲染。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)