Qt中的OpenGL (4)[纹理]

文章说明

本文是学习OpenGL的笔记,主要参考大神JoeyDeVriesLearnOpenGL第六课《纹理》,并将教程中的代码基于Qt进行实现。

学习目标

  • 掌握纹理基本知识
  • 掌握纹理贴图

目录结构

|-
|-- HelloTextures|--- hello_textures.cpp|--- hello_textures.h|--- main.cpp|--- CMakeLists.txt
|-- CMakeLists.txt

整个项目的全部CMakeLists.txt文件与上一篇 Qt中的OpenGL (3)[着色器] 中的内容基本一致,只需要将全部HelloShader替换成HelloTextures就可以了。

在前边的教程中绘制三角形的时候用到顶点的位置和颜色两个属性,三个顶点属性数据可以完成一个纯色(三点颜色一致)或者彩色(三点颜色不一致)的三角形,但下面这种颜色的三角形应该就不会只有三个顶点属性这么简单了。

纹理结果展示
要绘制上面这个三角形就需要用到大量的顶点属性,并且每个顶点属性都需要带有颜色属性,并且颜色属性的设置要细致到每个像素,这种做法会增加额外的开销。这个时候就需要用到纹理了,简单来说纹理就是将图片按照规则贴到物体模型上。

纹理坐标

在现实生活中如果需要给一个物体贴上图片正常情况下是要先测量物体大小然后准备一个合适的贴纸,最后物体的边角对应贴纸的边角完全贴合,在开发过程中模型与纹理图片之间经常存在不匹配的情况,如下图所示:

纹理坐标示意图
上图中纹理图片的像素是200 * 200而三角形在屏幕上显示的像素是1000 * 1000这无论如何也无法一一对应了。此时,就需要使用纹理坐标(UV),一般使用U和V表示纹理坐标,其中U表示横坐标百分比V表示纵坐标百分比,使用百分比的方式代替实际数值的对应方式,纹理坐标起始于左下角(0, 0),终止于右上角(1, 1)

类似于上面纹理图映射到图形的场景,纹理设置如下:

  • 三角形左下角对应纹理图左下角因此纹理坐标就是(0.0, 0.0),对应的像素值就是w=0, h=0
  • 三角形右下角对应纹理图右下角因此纹理坐标就是(1.0, 0.0),对应的像素值就是w=200, h=0
  • 三角形顶角对应纹理图的上中点因此纹理坐标就是(0.5, 1.0),对应的像素值就是w=100, h=200

注意:除了设置的纹理坐标外,其他纹理坐标都是根据已设置的纹理坐标经过插值计算而来的。

纹理过滤

单独使用纹理坐标也不能解决需要绘制的像素和实际纹理图片像素不匹配问题,解决绘制像素与纹理像素不匹配问题有两种方式,分别是Nearest Neighbor FilteringLinear Filtering

邻近过滤(Nearest Neighbor Filtering)

这是一种默认的过滤方式,根据UV坐标计算出来的小数坐标,取最近的整数坐标像素,这种取值方式可能回去到会多次相同的像素色块,导致颗粒感比较强是一种像素风格。

邻近纹理过滤

线性插值过滤(Linear Filtering)

另外一种是根据UV计算出来的小数坐标,综合周边像素得到新的像素。这种方式根据周围像素产生新的像素色块,相当于对原始纹理图片进行扩充。

双线性插值过滤
这两种过滤方式在解决像素不匹配问题上并没有绝对的使用规则。一般情况使用情况如下:

  • 需要绘制像素超过图片纹理像素,使用线性过滤。
  • 需要绘制像素少于图片纹理像素,使用邻近过滤。

设置过滤方式的函数如下,这个函数包含了纹理的过滤方式设置和纹理的环绕方式,这里先说过滤方式相关参数

void glTexParameteri(GLenum target, GLenum pname, GLint param);
  • 设置纹理过滤方式

    • target: 指定纹理目标类型,它表示要设置参数的纹理类型。
    • pname: 指定要设置的纹理参数名称。
    • param: 指定过滤方式。
  • target可设置参数,不区分过滤设置和环绕设置

    • GL_TEXTURE_1D:一维纹理,常用于模拟渐变效果,如颜色渐变条。

    • GL_TEXTURE_2D:二维纹理,最常用的纹理类型,用于给物体表面贴图,像给立方体的每个面贴上不同的图片。

    • GL_TEXTURE_3D:三维纹理,包含深度信息,可用于表示体积数据,例如医学上的 CT 扫描数据。

    • GL_TEXTURE_CUBE_MAP:立方体贴图,由 6 个二维纹理组成,用于模拟环境反射,比如天空盒效果。

    • GL_TEXTURE_1D_ARRAY:一维纹理数组,由多个一维纹理组成,可用于存储多个相关的一维纹理数据。

    • GL_TEXTURE_2D_

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java多线程从青铜到王者】阻塞队列(十)

阻塞队列 阻塞队列也是一种队列,先进的先出 阻塞队列就是对普通的队列做出的拓展 阻塞队列的特性 1.线程安全的,我们普通的队列值线程不安全的 2.具有阻塞的特性: a》如果针对一个已经满了的队列进行如队列操作的话,入队列操作就…

Python打卡第52天

浙大疏锦行 作业: 对于day41的简单cnn,看看是否可以借助调参指南进一步提高精度。 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import ma…

力扣100- 环形链表

方法一 遍历 循环链表&#xff0c;查找链表节点是否重复出现 public boolean hasCycle(ListNode head) {Set<ListNode> set new HashSet<>(); if (head null) return false; while (head ! null) {if (set.contains(head)) {return true;}set.add(head);head …

Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法

在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值&#xff0c;可通过以下步骤实现&#xff1a; 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置&#xff1a; xml 复制 下载 运行 <insert id"insertUser" para…

Meta发布V-JEPA 2世界模型及物理推理新基准,推动AI在物理世界中的认知与规划能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0

在全球科技竞争加剧和供应链安全日益重要的背景下&#xff0c;实现关键软硬件的全国产化替代已成为国家战略和产业共识。在这一背景下&#xff0c;触觉智能推出RK3576核心板,率先适配开源鸿蒙OpenHarmony5.0操作系统&#xff0c;真正实现了从芯片到操作系统的全栈国产化方案&am…

前端基础知识ES6系列 - 01(var、let、const之间的区别)

一、var 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量既是全局变量&#xff0c;也是顶层变量 注意&#xff1a;顶层对象&#xff0c;在浏览器环境指的是window对象&#xff0c;在 Node 指的是global对象 var a 10; console.log(window…

Python Docker 镜像构建完整指南:从基础到优化

Python 是一门广泛使用的编程语言,在容器化环境中,构建和使用 Python 镜像是非常常见的任务。本文将提供一个完整的指南,包括选择基础镜像、制作流程、不同场景下的应用、安全性最佳实践以及镜像优化策略。 1. 选择合适的基础镜像 1.1 官方 Python 镜像 Docker Hub 提供了…

【狂飙AGI】第1课:大模型概述

目录 &#xff08;一&#xff09;大模型概念解析&#xff08;二&#xff09;大模型发展历程&#xff08;三&#xff09;大模型发展现状&#xff08;1&#xff09;OpenAI&#xff08;2&#xff09;微软&#xff08;3&#xff09;谷歌&#xff08;4&#xff09;Meta &#xff08;…

vite ts 配置使用@ 允许js

1.vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import { fileURLToPath, URL } from node:url import setup_extend from vite-plugin-vue-setup-extend// https://vite.dev/config/ export default defineConfig({plugins: …

使用Ollama+open-webui搭建本地AI模型

本地搭建AI模型 说明&#xff1a;1、下载Ollama2、下载模型3、pip安装open-webui&#xff08;不推荐&#xff09;1、Python版本不对应2、下载wheels失败 4、docker安装open-webui 说明&#xff1a; 在windows上搭建本地AI&#xff0c;使用Ollamaopen-webui的方式&#xff0c;可…

第 87 场周赛:比较含退格的字符串、数组中的最长山脉、一手顺子、访问所有节点的最短路径

Q1、[简单] 比较含退格的字符串 1、题目描述 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 **注意&#xff1a;**如果对空文本输入退格字符&#xff0c;文本继续为空。 示例 …

linux安装阿里DataX实现数据迁移

目录 下载datax工具包(如果下载慢&#xff0c;请尝试其他国内镜像站或其他网站下载相应资源) 解压工具包到当前目录里 接着进入conf配置目录并创建一个myjob.json&#xff08;临时测试json&#xff09;&#xff0c;myjob.json内容如下&#xff0c;用于模拟test库tab1表数据同…

C++ 引用介绍

很好&#xff01;既然你有 C 的基础&#xff0c;那么理解 C 的「引用&#xff08;reference&#xff09;」会容易很多。我们来一步步讲清楚这个概念。 &#x1f31f; 一句话总结&#xff1a; C 引用&#xff08;reference&#xff09;就是已存在变量的“别名”&#xff0c;它不…

学习笔记086——@PostConstruct注解和InitializingBean接口的使用

文章目录 1、PostConstruct注解1.1 介绍1.2 用法1.3 场景 2、InitializingBean接口2.1 介绍2.2 用法 1、PostConstruct注解 1.1 介绍 PostConstruct 是 Java EE/Jakarta EE 中的一个注解&#xff0c;用于标记一个方法在依赖注入完成后执行初始化操作。它通常与 Spring 框架一…

考研系列—408真题操作系统篇(2015-2019)

目录 # 2015年 1.死锁处理 (1)预防死锁 (2)避免死锁 (3)死锁检测和解除 2.请求分页系统的页面置换策略、页面置换策略 3.页、页框、页表,基本分页系统 # 2016年 1.异常、中断 2.页置换算法 3.进程的互斥操作 4.SPOOLing技术(从软件方面实现设备共享) 5.一定要牢记…

argocd部署cli工具并添加k8s集群

先决条件: 1.已经有k8s集群,(网上一万种部署方式,这里我使用的是kubekey部署的),也埋了个坑,后面说明. 2.已经部署好argocd,并验证web已经可以访问.参见 k8s部署argocd-CSDN博客 部署客户端工具, 这里我是从web页面上直接下载的对应版本的cli工具. 打开已经部署好的argoc…

打卡day52

简单cnn 借助调参指南进一步提高精度 基础CNN模型代码 import tensorflow as tf from tensorflow.keras import layers, models from tensorflow.keras.datasets import cifar10 from tensorflow.keras.utils import to_categorical# 加载数据 (train_images, train_labels),…

OpenGL ES绘制3D图形以及设置视口

文章目录 关于 glDrawElements基本概念使用场景mode 绘制模式type 索引数据类型indices 索引缓冲区工作原理绘制正方体实例 视口透视投影&#xff08;Perspective Projection&#xff09;正交投影&#xff08;Orthographic Projection&#xff09;正交投影和透视投影对比 关于 …

【SAS求解多元回归方程】REG多元回归分析-多元一次回归

多元一次回归是一种统计方法&#xff0c;用于分析多个自变量&#xff08;解释变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的线性关系。 目录 【示例】 基本语法 SAS代码 参数估计 方差分析 回归统计量 y的拟合诊断 y的回归变量值 【示例】 设Y…