qt QOpenGLTexture详解

打印 上一主题 下一主题

主题 1027|帖子 1027|积分 3081

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 概述

QOpenGLTexture 是 Qt5 提供的一个类,用于表现和管理 OpenGL 纹理。它封装了 OpenGL 纹理的创建、分配存储、绑定和设置像素数据等操纵,简化了 OpenGL 纹理的使用。


2. 紧张函数



  • 构造函数

    • QOpenGLTexture(const QImage &image, QOpenGLTexture::MipMapGeneration genMipMaps = GenerateMipMaps)
    • QOpenGLTexture(QOpenGLTexture::Target target)

  • 纹理配置

    • void allocateStorage()
    • void allocateStorage(QOpenGLTexture:ixelFormat pixelFormat, QOpenGLTexture:ixelType pixelType)
    • void setFormat(QOpenGLTexture::TextureFormat format)
    • void setLayers(int layers)
    • void setSize(int width, int height = 1, int depth = 1)

  • 绑定息争绑

    • void bind()
    • void bind(uint unit, QOpenGLTexture::TextureUnitReset reset = DontResetTextureUnit)
    • void release()
    • void release(uint unit, QOpenGLTexture::TextureUnitReset reset = DontResetTextureUnit)

  • 设置像素数据

    • void setData(int mipLevel, QOpenGLTexture:ixelFormat sourceFormat, QOpenGLTexture:ixelType sourceType, const void *data, const QOpenGLPixelTransferOptions *const options = nullptr)
    • void setData(const QImage &image, QOpenGLTexture::MipMapGeneration genMipMaps = GenerateMipMaps)

  • 天生 Mipmaps

    • void generateMipMaps()
    • void generateMipMaps(int baseLevel, bool resetBaseLevel = true)

  • 获取纹理属性

    • int width() const
    • int height() const
    • int depth() const
    • GLuint textureId() const



3. 常用枚举范例



  • BindingTarget:纹理绑定目标,如 BindingTarget2D、BindingTargetCubeMap 等。
  • ComparisonFunction:深度和模板比较函数。
  • ComparisonMode:比较模式,如 CompareRefToTexture。
  • CubeMapFace:立方体贴图的各个面,如 CubeMapPositiveX。
  • DepthStencilMode:深度和模板模式。
  • Feature:纹理特性,如 TextureRectangle、TextureArrays。
  • Filter:纹理过滤方式,如 Nearest、Linear。
  • MipMapGeneration:是否天生 Mipmaps,GenerateMipMaps 或 DontGenerateMipMaps。
  • PixelFormat:像素格式,如 RGBA8888。
  • PixelType:像素范例,如 UnsignedByte。
  • SwizzleComponent:颜色通道,如 SwizzleRed。
  • SwizzleValue:颜色值,如 RedValue。
  • Target:纹理目标,如 Target2D。
  • TextureFormat:纹理格式,如 RGB8_UNorm。
  • WrapMode:纹理环绕模式,如 Repeat、ClampToEdge。
  1. #include "widget.h"
  2. float vertices[] = {
  3.     // positions          // colors           // texture coords
  4.      0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right
  5.      0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // bottom right
  6.     -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // bottom left
  7.     -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // top left
  8. };
  9. unsigned int indices[] = {
  10.     0, 1, 3, // first triangle
  11.     1, 2, 3  // second triangle
  12. };
  13. MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent)
  14. {
  15. }
  16. MyGLWidget::~MyGLWidget()
  17. {
  18.     glDeleteVertexArrays(1, &VAO);
  19.     glDeleteBuffers(1, &VBO);
  20.     glDeleteBuffers(1, &EBO);
  21. }
  22. void MyGLWidget::initializeGL()
  23. {
  24.     initializeOpenGLFunctions(); // 初始化 OpenGL 函数
  25.     bool success;
  26.     m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shader/shader.vert");
  27.     m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shader/shader.frag");
  28.     success=m_shaderProgram.link();
  29.     if(!success) qDebug()<<"ERR:"<<m_shaderProgram.log();
  30.     //创建、绑定VAO
  31.     glGenVertexArrays(1, &VAO);
  32.     glBindVertexArray(VAO);
  33.     //创建、绑定VBO + 填充数据
  34.     glGenBuffers(1, &VBO);
  35.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  36.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  37.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  38.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  39.     //设置顶点属性指针
  40.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
  41.     glEnableVertexAttribArray(0);
  42.     // 颜色属性
  43.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3* sizeof(float)));
  44.     glEnableVertexAttribArray(1);
  45.     //纹理坐标
  46.     glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
  47.     glEnableVertexAttribArray(2);
  48.     //解绑缓冲区和 VAO
  49.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  50.     glBindVertexArray(0);
  51.     //创建、绑定纹理
  52.     m_diffuseTex = new QOpenGLTexture(QImage(":/img/container.png").mirrored());
  53.     m_specularTex = new QOpenGLTexture(QImage(":/img/awesomeface.png").mirrored());
  54.     m_shaderProgram.bind();
  55.     m_shaderProgram.setUniformValue("texture1", 0);
  56.     m_shaderProgram.setUniformValue("texture2", 1);;
  57. }
  58. void MyGLWidget::paintGL()
  59. {
  60.     glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  61.     glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区
  62.     m_shaderProgram.bind();
  63.     m_diffuseTex->bind(0);
  64.     m_specularTex->bind(1);
  65.     glBindVertexArray(VAO);
  66.     //glDrawArrays(GL_TRIANGLES, 0, 3);
  67.     glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  68.     glBindVertexArray(0);
  69. }
  70. void MyGLWidget::resizeGL(int w, int h)
  71. {
  72.     glViewport(0, 0, w, h); // 设置视口大小
  73. }
  74. unsigned int MyGLWidget::loadTexture(const char *fileName, bool alpha)
  75. {
  76.     unsigned int texture;
  77.     glGenTextures(1, &texture); // 生成纹理 ID
  78.     glBindTexture(GL_TEXTURE_2D, texture); // 绑定纹理
  79.     // 设置纹理参数
  80.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  81.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  82.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  83.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  84. #if 0
  85.     // 加载图片并转换为 OpenGL 格式
  86.     QImage image;
  87.     if (!image.load(fileName))
  88.     {
  89.         qWarning() << "Failed to load texture image";
  90.         return 0;
  91.     }
  92.     image = QGLWidget::convertToGLFormat(image); // 转换为 OpenGL 格式
  93.     unsigned char *data = image.bits();
  94.     // 生成纹理
  95.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
  96.     glGenerateMipmap(GL_TEXTURE_2D); // 生成多级渐远纹理
  97. #else
  98.     QFile file(fileName);
  99.     file.copy(file.fileName(), QFileInfo(file).fileName());
  100.     int width, height, nrChannels;
  101.     stbi_set_flip_vertically_on_load(true); // tell stb_image.h to flip loaded texture's on the y-axis.
  102.     unsigned char *data = stbi_load(QFileInfo(file).fileName().toStdString().c_str(), &width, &height, &nrChannels, 0);
  103.     if (data)//awesomeface  container
  104.     {
  105.         if(alpha)
  106.             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
  107.         else
  108.             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
  109.         glGenerateMipmap(GL_TEXTURE_2D);
  110.     }
  111.     else
  112.     {
  113.         std::cout << "Failed to load texture1" << std::endl;
  114.     }
  115.     stbi_image_free(data);
  116. #endif
  117.     return texture;
  118. }
复制代码

觉得有帮助的话,打赏一下呗。。
           

需要商务互助(定制程序)的欢迎私信!! 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表