OpenGL纹理

纹理采样器----纹理坐标

只有纹理坐标,纹理没有作用。

纹理坐标是在顶点着色器中设置,需要传入片段着色器,在片段着色器中需要定义纹理采样器。

然后调用texture函数利用采样器和纹理坐标对纹理进行采样。

我们使用GLSL内建的texture函数来采样纹理的颜色,它第一个参数是纹理采样器,第二个参数是对应的纹理坐标。texture函数会使用之前设置的纹理参数对相应的颜色值进行采样。这个片段着色器的输出就是纹理的(插值)纹理坐标上的(过滤后的)颜色。

绑定纹理采样器到纹理单元

不绑定

当纹理只有一个时,这个纹理单元默认是被激活的,可以不用给采样器指定纹理单元,默认使用的就是第一个纹理。

绑定

当有多个纹理时,如果我们需要选择使,就需要给采样器指定我们需要的纹理单元。

设置采样器和纹理单元的对应关系

片段着色器

#version 330 core
in vec2 textureCoor;
uniform sampler2D texture0;
uniform sampler2D texture1;
void main()
{gl_FragColor =texture(texture0,textureCoor);
}

纹理

    m_texture0=new QOpenGLTexture(QImage(":/image/tree.png"));//.mirrored());m_texture1=new QOpenGLTexture(QImage(":/image/laugh.png"));

采样器绑定到对应的纹理单元

    shaderProgram.setUniformValue("texture0",0);shaderProgram.setUniformValue("texture1",1);

将第一个纹理绑定到第一个纹理单元

m_texture0->bind(0);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);

 

将第二个纹理绑定到第一个纹理单元

m_texture1->bind(1);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);

第二个采样器在着色器中没有使用,如果将纹理绑定到第二个采样器,就不会发生采样:

m_texture1->bind(1);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);

 纹理单元

纹理单元不是纹理对象。


纹理单元是 OpenGL 中负责纹理管理的概念之一,它是一个由硬件实现的状态机,用于在不同的纹理对象和纹理参数之间切换。在渲染过程中,我们可以使用不同的纹理单元,从而使用不同的纹理对象和纹理参数。纹理单元类似于一个数组,其索引就是纹理单元的编号,编号从 0 开始,直到硬件所支持的最大纹理单元数。

一般情况下,在渲染过程中,我们需要先绑定纹理对象到纹理单元上,然后再渲染对应的图形。一个纹理单元可以绑定一个纹理对象,也可以切换到另一个纹理对象。

在 OpenGL 中,使用 `glActiveTexture()` 函数来选择当前的纹理单元。`glActiveTexture()` 函数的参数是纹理单元的编号,例如 `GL_TEXTURE0` 表示纹理单元 0,`GL_TEXTURE1` 表示纹理单元 1,以此类推。

示例代码如下:

```cpp
// 选择纹理单元 0
glActiveTexture(GL_TEXTURE0);

// 绑定纹理对象到纹理单元 0 上
glBindTexture(GL_TEXTURE_2D, textureID);

// 在着色器程序中传递纹理单元号
glUniform1i(glGetUniformLocation(programID, "texture"), 0);
```

在上述示例代码中,我们选择纹理单元 0,然后将纹理对象 `textureID` 绑定到该纹理单元上。然后,我们将纹理单元号 0 传递到着色器程序中的 `texture` uniform 变量中。这样,在渲染过程中,OpenGL 就会从纹理单元 0 中获取相应的纹理对象来渲染。
 

指定纹理单元的两种方式

OpenGL至少保证有16个纹理单元供你使用,也就是说你可以激活从GL_TEXTURE0到GL_TEXTRUE15。它们都是按顺序定义的,所以我们也可以通过GL_TEXTURE0 + 8的方式获得GL_TEXTURE8。

纹理对象--纹理采样器--纹理单元

纹理单元和纹理采样器是相关概念但并不完全相同。

纹理单元是管理纹理对象的硬件状态机,它是通过指定纹理单元编号来管理不同的纹理对象和纹理参数的。一个纹理单元可以绑定一个纹理对象,并且可以被多个纹理采样器所使用。

纹理采样器是在着色器程序中声明的 uniform 变量,用于在纹理采样过程中控制纹理的采样方式(例如使用线性过滤还是最邻近过滤等)和采样坐标的变换(例如旋转、缩放等)。纹理采样器用于指定在片段着色器中对应的纹理单元,以便于绑定特定的纹理对象。

因此,纹理单元和纹理采样器的作用不同,但它们常常被一起使用。在着色器程序中,我们通过纹理采样器来指定纹理的采样方式和变换方式,然后使用 `glUniform1i()` 函数将该纹理采样器绑定到相应的纹理单元上,从而实现在特定的纹理单元中呈现相应的纹理对象。

纹理采样器通过shader.setUniformValue("xxx",n)绑定到对应的纹理单元;

纹理对象通过bind(n)绑定到对应的纹理单元;

总之,纹理对象设置进入纹理单元;纹理采样器从纹理单元读取纹理对象进行采样。

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

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

相关文章

【云原生】Docker 详解(三):Docker 镜像管理基础

Docker 详解(三):Docker 镜像管理基础 1.镜像的概念 镜像可以理解为应用程序的集装箱,而 Docker 用来装卸集装箱。 Docker 镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。 Dock…

Debian/Ubuntu清理硬盘空间

Debian/Ubuntu清理硬盘空间_debian清理磁盘空间_weixin_43606319的博客-CSDN博客 1. 删除残余的配置文件 通常Debian/Ubuntu删除软件包可以用两条命令 sudo apt-get remove <package-name> sudo apt-get purge <package-name> remove将会删除软件包&#xff0…

激光切割机的操作中蛙跳技术是什么意思

其实&#xff0c;蛙跳技术就是指在激光切割机运行的过程中&#xff0c;机器换位置的方式。打个比方&#xff0c;你刚刚在这儿把孔1切好了&#xff0c;接下来就得跑到那儿把孔2切了。 在这个过程中&#xff0c;激光切割机就像是一只青蛙&#xff0c;要从一个位置跳到另一个位置。…

PAT 1085 Perfect Sequence

个人学习记录&#xff0c;代码难免不尽人意 Sample Input: 10 8 2 3 20 4 5 1 6 7 8 9 Sample Output: 8 #include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<string> #include<map> #include<cmath&…

Kali中AWD靶机环境搭建

Kali中AWD靶机环境搭建 1、kali安装docker2、克隆项目&#xff08;400多M&#xff0c;下载会有点久&#xff09;3、进入项目4、下载镜像5、改镜像名6、比赛环境搭建6.1 启动靶机6.2 连接裁判机&#xff0c;启动check脚本6.3 关闭环境命令 7、 靶机访问方式7.1 web界面访问7.2 s…

Redis之缓存雪崩、缓存击穿、缓存穿透问题

文章目录 前言一、缓存雪崩1.1、原因分析2.2、常用解决方案 二、缓存击穿2.1、原因分析2.2、常用解决方案2.2.1、使用互斥锁2.2.2、逻辑过期方案2.3、方案对比 三、缓存穿透3.1、原因分析3.2、解决方案3.2.1、缓存空对象3.2.3、布隆过滤3.3、方案对比 总结 前言 本文谈谈Redis…

C++实现一键关闭桌面

方法一&#xff1a; C关闭桌面,explorer.exe #include<Windows.h> #include <TlHelp32.h> #include"resource.h" #pragma warning(disable:4996) void taskkill(const char * name) {HANDLE info_handle CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,…

本地安装hadoop及其依赖组件

安装目录以及各个版本 大数据安装版本 软件版本备注hadoophadoop-3.3.4hdfs基础sparkspark-3.2.4-bin-hadoop3.2计算框架zookeeperapache-zookeeper-3.5.7-bin分布式服务器hbasehbase-2.4.11列式存储hiveapache-hive-3.1.3-bin数仓元数据 启动服务 su - hadoop -- 启动hadoo…

【LangChain概念】了解语言链️:第2部分

一、说明 在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架&#xff0c;它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则&#xff0c;LangChain正在重新定义通过传统API可以实现的极限。 在上一篇博…

Unity-UGUI优化策略

界面出栈规则&#xff1a; 界面目录导航、策划界面回退需求造成界面套娃问题&#xff0c;夹带一系列层级问题&#xff0c;应该和策划进行友好沟通&#xff0c;避免界面不合理的出栈入栈规则 overdraw&#xff1a; 尽量减少同屏 半透明物体渲染 Unity 之 UGUI优化&#xff08;…

Mass Adoption调研

MPC钱包 MPC是什么&#xff1f; MPC定义&#xff1a;Multi-Party Computation 多方计算 技术原理&#xff1a;MPC 钱包通过使用阈值签名方案 (TSS) 消除了单点问题 开源项目tss-lib: GitHub - bnb-chain/tss-lib: Threshold Signature Scheme, for ECDSA and EDDSA 和智能合约钱…

无涯教程-Perl - endpwent函数

描述 此功能告诉系统您不再希望使用getpwent从密码文件读取条目。在Windows下,使用Win32API::Net函数从域服务器获取信息。 语法 以下是此函数的简单语法- endpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $pas…