qt QOpenGLTexture詳解

1. 概述

QOpenGLTexture 是 Qt5 提供的一個類,用于表示和管理 OpenGL 紋理。它封裝了 OpenGL 紋理的創建、分配存儲、綁定和設置像素數據等操作,簡化了 OpenGL 紋理的使用。

2. 重要函數
  • 構造函數

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

    • QOpenGLTexture(QOpenGLTexture::Target target)

  • 紋理配置

    • void allocateStorage()

    • void allocateStorage(QOpenGLTexture::PixelFormat pixelFormat, QOpenGLTexture::PixelType 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::PixelFormat sourceFormat, QOpenGLTexture::PixelType 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:紋理綁定目標,如 BindingTarget2DBindingTargetCubeMap 等。

  • ComparisonFunction:深度和模板比較函數。

  • ComparisonMode:比較模式,如 CompareRefToTexture

  • CubeMapFace:立方體貼圖的各個面,如 CubeMapPositiveX

  • DepthStencilMode:深度和模板模式。

  • Feature:紋理特性,如 TextureRectangleTextureArrays

  • Filter:紋理過濾方式,如 NearestLinear

  • MipMapGeneration:是否生成 Mipmaps,GenerateMipMapsDontGenerateMipMaps

  • PixelFormat:像素格式,如 RGBA8888

  • PixelType:像素類型,如 UnsignedByte

  • SwizzleComponent:顏色通道,如 SwizzleRed

  • SwizzleValue:顏色值,如 RedValue

  • Target:紋理目標,如 Target2D

  • TextureFormat:紋理格式,如 RGB8_UNorm

  • WrapMode:紋理環繞模式,如 RepeatClampToEdge

#include "widget.h"float vertices[] = {// positions          // colors           // texture coords0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right0.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
};
unsigned int indices[] = {0, 1, 3, // first triangle1, 2, 3  // second triangle
};MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{}MyGLWidget::~MyGLWidget()
{glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteBuffers(1, &EBO);
}void MyGLWidget::initializeGL()
{initializeOpenGLFunctions(); // 初始化 OpenGL 函數bool success;m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shader/shader.vert");m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shader/shader.frag");success=m_shaderProgram.link();if(!success) qDebug()<<"ERR:"<<m_shaderProgram.log();//創建、綁定VAOglGenVertexArrays(1, &VAO);glBindVertexArray(VAO);//創建、綁定VBO + 填充數據glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//設置頂點屬性指針glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 顏色屬性glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3* sizeof(float)));glEnableVertexAttribArray(1);//紋理坐標glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));glEnableVertexAttribArray(2);//解綁緩沖區和 VAOglBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);//創建、綁定紋理m_diffuseTex = new QOpenGLTexture(QImage(":/img/container.png").mirrored());m_specularTex = new QOpenGLTexture(QImage(":/img/awesomeface.png").mirrored());m_shaderProgram.bind();m_shaderProgram.setUniformValue("texture1", 0);m_shaderProgram.setUniformValue("texture2", 1);;
}void MyGLWidget::paintGL()
{glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT); // 清除顏色緩沖區m_shaderProgram.bind();m_diffuseTex->bind(0);m_specularTex->bind(1);glBindVertexArray(VAO);//glDrawArrays(GL_TRIANGLES, 0, 3);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glBindVertexArray(0);
}void MyGLWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h); // 設置視口大小
}unsigned int MyGLWidget::loadTexture(const char *fileName, bool alpha)
{unsigned int texture;glGenTextures(1, &texture); // 生成紋理 IDglBindTexture(GL_TEXTURE_2D, texture); // 綁定紋理// 設置紋理參數glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
#if 0// 加載圖片并轉換為 OpenGL 格式QImage image;if (!image.load(fileName)){qWarning() << "Failed to load texture image";return 0;}image = QGLWidget::convertToGLFormat(image); // 轉換為 OpenGL 格式unsigned char *data = image.bits();// 生成紋理glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, data);glGenerateMipmap(GL_TEXTURE_2D); // 生成多級漸遠紋理
#elseQFile file(fileName);file.copy(file.fileName(), QFileInfo(file).fileName());int width, height, nrChannels;stbi_set_flip_vertically_on_load(true); // tell stb_image.h to flip loaded texture's on the y-axis.unsigned char *data = stbi_load(QFileInfo(file).fileName().toStdString().c_str(), &width, &height, &nrChannels, 0);if (data)//awesomeface  container{if(alpha)glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);elseglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);glGenerateMipmap(GL_TEXTURE_2D);}else{std::cout << "Failed to load texture1" << std::endl;}stbi_image_free(data);
#endifreturn texture;
}

覺得有幫助的話,打賞一下唄。。

? ? ? ? ? ?

需要商務合作(定制程序)的歡迎私信!!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70069.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nlp|微調大語言模型初探索(2),訓練自己的聊天機器人

前言 上篇文章記錄了具體的微調語言大模型步驟&#xff0c;以及在微調過程中可能遇見的各種報錯&#xff0c;美中不足的是只是基于開源數據集的微調&#xff0c;今天來記錄一下怎么基于自己的數據集去微調大語言模型&#xff0c;訓練自己的智能機器人&#xff01;&#xff01;&…

Java 大視界 -- 量子計算時代 Java 大數據的潛在變革與應對策略(88)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

手機功耗BugReport字段含義介紹

BugReport一般用來分析功耗問題&#xff0c;例如休眠待機&#xff0c;后臺待機&#xff0c;游戲&#xff0c;視頻&#xff0c;相機場景等 BugReport字段含義介紹 BugReport字段 含義 備注 Reboot 設備的重啟事件 CPU running CPU運行狀態&#xff0c;休眠 或者 喚醒 只有…

什么是 近端策略優化算法PPO

什么是 近端策略優化算法PPO 近端策略優化算法(Proximal Policy Optimization,PPO)是OpenAI公司于2017年開發的一系列無模型強化學習算法,用于優化策略網絡以最大化累計獎勵。以下是具體介紹及示例: 算法原理 策略梯度:PPO基于策略梯度算法,通過估計策略網絡的梯度來更…

計算機視覺-局部特征

一、局部特征 1.1全景拼接 先用RANSAC估計出變換&#xff0c;就可以拼接兩張圖片 ①提取特征 ②匹配特征 ③拼接圖像 1.2 點的特征 怎么找到對應點&#xff1f;&#xff08;才能做點對應關系RANSAC&#xff09; &#xff1a;特征檢測 我們希望找到的點具有的特征有什么特…

個人搭建CDN加速服務 特網科技

在互聯網快速發展的今天&#xff0c;網站的加載速度對用戶體驗有著至關重要的影響&#xff0c;傳統的網頁加載方式依賴于服務器的性能和網絡環境&#xff0c;這使得某些網站的頁面加載時間過長&#xff0c;用戶體驗不佳&#xff0c;為了解決這個問題&#xff0c;許多企業開始采…

類型通配符上限

主函數 package typeWildcardTop;import java.util.ArrayList;public class typeWildcardTopTest {/**/public static void main(String[] args) { // test1();test2();}/*測試showList接收ArrayList類型 ArrayList接收各種類型參數創建animals cats mincats集合 傳入s…

OpenCV(1):簡介、安裝、入門案例、基礎模塊

1 OpenCV 簡介 OpenCV 是一個功能強大、應用廣泛的計算機視覺庫&#xff0c;它為開發人員提供了豐富的工具和算法&#xff0c;可以幫助他們快速構建各種視覺應用。隨著計算機視覺技術的不斷發展&#xff0c;OpenCV 也將會繼續發揮重要的作用。OpenCV 提供了大量的計算機視覺算法…

FTP自動上傳/vue打包自動上傳

ftp自動上傳 在我們平時開發項目時&#xff0c;需要將本地代碼編譯后上傳到服務器&#xff0c;我們可以借助Node.js庫中的ssh2來實現自動上傳 首先我們先來說下ssh2的安裝和使用 安裝ssh2 npm install ssh2創建ssh2實例 const { Client } require(ssh2);連接服務器 const c…

SQL復習

SQL復習 MySQL SQL介紹 SQL SQL的全拼是什么&#xff1f; SQL全拼&#xff1a;Structured Query Language&#xff0c;也叫結構化查詢語言。 SQL92和SQL99有什么區別呢&#xff1f; SQL92和SQL99分別代表了92年和99年頒布的SQL標準。 在 SQL92 中采用&#xff08;&#xff…

nlp|微調大語言模型初探索(1),LLaMA-Factory

前言 微調模型通常比從零開始訓練一個模型的技術要求低。公司不需要擁有大量的深度學習專家&#xff0c;利用現有的開源工具和庫&#xff08;如Hugging Face的Transformers等&#xff09;&#xff0c;中小型公司可以輕松地使用和微調大型模型&#xff0c;從而快速實現AI能力的集…

軟件定義汽車時代的功能安全和信息安全

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 簡單&#xff0c;單純&#xff0c;喜歡獨處&#xff0c;獨來獨往&#xff0c;不易合同頻過著接地氣的生活…

內容中臺驅動企業數字化內容管理高效協同架構

內容概要 在數字化轉型加速的背景下&#xff0c;企業對內容管理的需求從單一存儲向全鏈路協同演進。內容中臺作為核心支撐架構&#xff0c;通過統一的內容資源池與智能化管理工具&#xff0c;重塑了內容生產、存儲、分發及迭代的流程。其核心價值在于打破部門壁壘&#xff0c;…

【探商寶】:大數據與AI賦能,助力中小企業精準拓客引

引言&#xff1a;在數據洪流中&#xff0c;如何精準鎖定商機&#xff1f; 在競爭激烈的商業環境中&#xff0c;中小企業如何從海量信息中快速篩選出高價值客戶&#xff1f;如何避免無效溝通&#xff0c;精準觸達目標企業&#xff1f; 探商寶——一款基于大數據與AI技術的企業信…

springboot接入ShardingJDBC

ShardingJDBC 是 Apache ShardingSphere 的一個子項目&#xff0c;它是一個開源的分庫分表中間件&#xff0c;提供了透明化的數據分片、分布式事務和數據庫治理等功能。ShardingJDBC 以 JDBC Driver 的形式提供&#xff0c;支持任何基于 JDBC 的 ORM 框架、持久層框架和數據庫連…

Dify平臺搭建面試機器人

無代碼搭建面試機器人 什么是Dify 什么是Dify Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使開發者可以快速搭建生產級的生成式 AI 應用。即使你是非技術人員&#xff0c;也能…

Django創建一個非前后端分離平臺

1.pub_blog前端創立 1.blog/pub路由 注意兩個路由的區別 2.完善頁面 用表單實現 3.加載wangeditor的幾個文件 4.配置樣式 5.配置js代碼&#xff0c;單獨放在js文件夾中&#xff0c;js文件夾pub_blog onload事件&#xff0c;加載完成后會再加載 5.提交按鈕

什么情況下索引會失效

一、索引創建的原則 1、針對數據量較大&#xff0c;且查詢比較頻繁的表建立索引。 單表超過10萬數據&#xff0c;即可增加索引 2、使用經常作為查詢條件&#xff08;where&#xff09;、排序&#xff08;order by&#xff09;、分組&#xff08;group by&#xff09;操作的字…

內容中臺重構企業內容管理流程驅動智能協作升級

內容概要 內容中臺作為企業數字化轉型的核心基礎設施&#xff0c;通過技術架構革新與功能模塊整合&#xff0c;重構了傳統內容管理流程的底層邏輯。其核心價值在于構建動態化、智能化的內容生產與流轉體系&#xff0c;將分散的創作、存儲、審核及分發環節納入統一平臺管理。基…

用deepseek學大模型04-模型可視化與數據可視化

deepseek.com: pytorch可視化工具 生成神經網絡圖 在 PyTorch 中&#xff0c;可視化神經網絡結構的常用工具和方法有以下幾種&#xff0c;以下將詳細介紹它們的用法&#xff1a; 1. TensorBoard (PyTorch 官方集成) PyTorch 通過 torch.utils.tensorboard 支持 TensorBoard&a…