- OpenGL 时代的 Texture 是一种名词
- D3D10+ 时代的 Texture 是另一种名词
- Vulkan 里的 Texture 是什么?
- 在 GPU 内部 Texture 既是名词也是动词
- Texture 到底是什么?
Texture 的含义在不同的时代与上下文中有着不同的含义,待我细细说来:
- OpenGL 时代的 Texture 是一种名词
- D3D10+ 时代的 Texture 是另一种名词
- Vulkan 里的 Texture 是什么?
- 在 GPU 内部 Texture 既是名词也是动词
OpenGL 时代的 Texture 是一种名词
从应用开发者来看,texture 是一个名词,在物理上指的是 GPU 显存中一段连续的空间。
这张图是一款 N 卡,最中间的是核心部分 GPU - GP104,texture 的物理位置就在 GPU 周围的 1-2-3-4-5-6-7-8 个显存颗粒里,这个 GPU 配着 8G 显存。 作为名词,texture 有着一些属性,比如宽度、高度、色彩通道数量,这部分属性和图片的属性相同的。
作为名词,texture 还有一些特殊的属性,比如 mipmap。当我们创建一张 texture 的时候,我们创建的通常是一组大小不一致的 texture。
这感觉就好像星巴克。
通常意义上 texture 是一个对 GPU 只读的资源,想写 texture 需要在它之上创建一个 fbo,这在逻辑上其实说不通。
D3D10+ 时代的 Texture 是另一种名词
D3D10 中引入了 view 的概念,和 texture 相关的 view 有
- 只读的 view,SRV
- 可写的 view,RTV
这个创新点就很赞了,texture 本身变成了一个读写权限无关的资源,你既可以去读它,也可以去写它。 texture 依然是名词,SRV 和 RTV 是副词。View 这个名字取得很好——观点。创建了资源之后需要告诉 GPU 怎么去访问这个资源。
名词和副词,细细体会。
这里提出第一个令人困惑的观点,D3D10 的 SRV 其实是 opengl 里的 texture。既然 SRV 是副词,那么 texture 也应该是副词?
Vulkan 里的 Texture 是什么?
Vulkan 的函数里并没有 Texture 这个词,取而代之的是 Image 和 ImageView。
Vulkan 的编程模型里所有资源分为两种,Buffer 和 Image。 Image 是 D3D10 中的 Texture,但是逻辑上更贴近 GPU 的实现,以后有空再说。光有 Image 是不行的,和 D3D10 一样,需要 View,不过这里没有区分 SRV 和 RTV。针对 Image 的所有的 View,都叫做 ImageView。
Vulkan 里的编程模型里,已经没有 Texture 这个名词。OpenGL 时代的 Texture 和 FBO,现在变成了 Image 和 ImageView。
在 GPU 内部 Texture 既是名词也是动词
下图是 N 卡内部运行 shader 的核心单元——streaming multiprocessor (SM),每个 SM 内部有固定的子单元,就叫做 Tex。
怕你们不信,再看下 A 卡内部执行 shader 的单元 —— compute unit (CU),它也有固定单元执行类似指令。
所以对 GPU 而言 Texture 是名词,是实实在在的硬件单元。
但是我要提出第二个令人困惑的观点,Texture 还是动词,当 SM / CU 运行的 shader 中需要读写显存中的资源时,读操作也叫做 TEX。
Texture 到底是什么?
它是名词、副词,也是动词,正确答案取决于上下文,以及是谁在问你。
vinjn.com - Democratizing Visual Computing