【免费下载链接】thebookofshaders
Step-by-step guide through the abstract and complex universe of Fragment Shaders.
本文基于 The Book of Shaders 词汇总(Glossary)中的 textureCube 词条 展开。词汇总收录于仓库的glossary/目录,按术语建立子目录、以README.md作为词条正文,并通过 glossary/index.php 动态渲染。读完本篇,你将完整掌握textureCube()的两个函数签名、sampler/coord/bias三个参数的确切含义、bias参与 MIP 细节层次(level of detail)计算的时机,以及它与 2D 采样函数texture2D()在坐标模型上的本质差异。
一、textureCube 是做什么的
词条开头给出的功能定义只有一句话:
Retrieving texels from a texture(从纹理中获取纹素 / 取色)
textureCube是 GLSL ES 中的纹理查询函数(Texture Lookup Function)。它接收一个立方体贴图采样器和一个三维坐标,返回该坐标处纹素的颜色值。词汇总在 glossary/README.md 的 "TEXTURE LOOKUP FUNCTIONS" 主题分类下,仅收录了两个查询函数:texture2D()与textureCube(),两者互为姊妹函数。
词条原文(英文 glossary/textureCube/README.md)的描述可以概括为三点:
- 函数返回一个纹素,即给定坐标处纹理的(颜色)值;
- 第一个入参类型是
samplerCube(纹理绑定所在的 uniform 采样器),第二个入参类型是vec3(要查询的纹素的三维坐标); - 存在一个可选的第三个
float参数bias。
与texture2D接收vec2的 UV 平面坐标不同,textureCube接收的是vec3方向向量——这也是"立方体"采样最核心的设计:它不是"在第几张图的第几个像素",而是"从立方体中心朝哪个方向看出去"。
二、函数声明
词条给出的两个签名如下:
vec4 textureCube(samplerCube sampler, vec3 coord) vec4 textureCube(samplerCube sampler, vec3 coord, float bias)两个签名都以vec4返回:前三个分量(.rgb)是纹理颜色,第四个分量(.a)是透明度,分量值与纹理存储精度一致,通常落在 0.0 到 1.0 区间。这一点在本书第 15 章讲 2D 纹理时有明确印证:图像被加载为sampler后,"忘了 255 这种悲伤的字节值",通道全部变成 0.0~1.0 的连续浮点值(见 15/README.md)。
第一个签名是最常用形式;第二个签名在 MIP 链场景下额外暴露了bias调节旋钮,下面分参数细讲。
三、参数逐项解析
3.1sampler:绑定纹理的采样器
词条原文:
samplerspecifies the sampler to which the texture from which texels will be retrieved is bound. (sampler指定从其中获取纹素的那张纹理所绑定的采样器。)
即一个uniform samplerCube变量。shader 内部看不到图像数据本身,CPU 端负责把图像上传到 GPU 并关联到某个纹理单元,再把该 uniform 传进 shader。本书第 15 章对 2D 纹理的说明同样强调了这一点:"这一切发生在 shader 之外"(All that happens outside the shader),shader 拿到的只是一个uniform sampler句柄。
对应的 shader 端声明形如:
uniform samplerCube u_cubeTex; // 由宿主程序绑定立方体贴图顺带说明:词汇总中 glossary/samplerCube/README.md 词条目前只是空骨架(仅有 Declaration / Parameters / Description 等标题,无正文),因此samplerCube类型的语义需要结合textureCube词条本身来理解——它本质上就是"绑定了一张 6 面立方体贴图的 uniform 句柄"。
3.2coord:三维采样坐标
词条原文:
coordspecifies the texture coordinates at which texture will be sampled. (coord指定将要在何处对纹理进行采样的纹理坐标。)
对textureCube而言,这个vec3坐标的几何含义是从立方体中心出发的方向向量。硬件会取该向量三个分量中绝对值最大的分量决定"视线穿入哪一面"(+x/-x/+y/-y/+z/-z六个面之一),再将其余两个分量除以该分量,把坐标归一化到所选面的 [-1, 1] 范围内取纹素。因此:
- 坐标的绝对长度并不重要,方向才重要(
(0.5, 0.5, 0.5)与(1.0, 1.0, 1.0)指向同一个纹素); - 这也是为什么经典用法里可以直接用视角向量或光线方向
vec3作为坐标,例如:
uniform samplerCube u_cubeTex; void main() { // dir 是任意方向向量(如视线方向、法线方向) vec4 color = textureCube(u_cubeTex, dir); gl_FragColor = color; }这个"方向即坐标"的模型正是天空盒(skybox)、环境反射等效果的实现基础:给每个像素一个方向,就能查回包围盒该方向的天空颜色。
3.3bias:MIP 计算时的可选偏置
词条原文:
biasspecifies an optional bias to be applied during level-of-detail computation. (bias指定在细节层次(LOD)计算期间要应用的可选偏置。)
描述段落进一步说明了它的作用时机:
There is an additional third input parameter of the type
float. After calculating the appropriate level of detail for a texture with mipmaps the bias is added before the actual texture lookup operation is executed. (存在一个额外的第三个float类型入参。对于带 MIP 纹理,在计算出合适的细节层次后,bias 会在实际执行纹理查询操作之前被加上。)
即bias的加入顺序是:先由硬件根据采样坐标计算出 MIP 层级 → 再叠加bias→ 最后按修正后的层级取纹素。其实际意义:
bias > 0:向"更低分辨率"的 MIP 层偏移,纹理显得更模糊/更平滑,常用于远处物体或防止走样闪烁;bias < 0:向"更高分辨率"的 MIP 层偏移,保留更多细节;- 若纹理没有 MIP 链,
bias不参与层级选择。
这与texture2D词条 glossary/texture2D/README.md 中bias的定义完全一致——两个查询函数共享同一套 bias 语义,只是坐标维度不同(vec2vsvec3)。
四、与 texture2D 的对比:同一个采样范式,两种坐标空间
词汇总把texture2D和textureCube并列在同一分类下,两者"See Also"互相指引用。对比两张签名即可看出差异的边界:
// 2D:平面 UV 坐标 vec4 texture2D(sampler2D sampler, vec2 coord) vec4 texture2D(sampler2D sampler, vec2 coord, float bias) // Cube:三维方向坐标 vec4 textureCube(samplerCube sampler, vec3 coord) vec4 textureCube(samplerCube sampler, vec3 coord, float bias)| 维度 | texture2D | textureCube |
|---|---|---|
| 采样器类型 | sampler2D | samplerCube |
| 坐标类型 | vec2(0.0~1.0 归一化平面坐标) | vec3(方向向量,长度无关) |
| 纹理结构 | 单张图像 | 6 面立方体 |
| bias 语义 | 相同:LOD 计算后叠加 | 相同:LOD 计算后叠加 |
| 返回类型 | vec4(RGB + alpha) | vec4(RGB + alpha) |
| 典型用途 | 图像后处理、纹理贴图 | 天空盒、环境反射 |
本书第 15 章 15/README.md 对 2D 纹理坐标的讲解,是理解 Cube 版"坐标系换了维度"的最佳铺垫:纹理坐标"与我们一直使用的归一化空间坐标完美匹配",取值在 0.0 到 1.0 之间。texture2D的vec2坐标正是这种归一化平面坐标;而textureCube跳出了"平面 UV"范式,改用方向向量寻址立方体的六个面。
仓库中第 15 章的最小 2D 采样示例 15/texture.frag 展示了完整的采样范式,可视为textureCube的"2D 版本模板":
void main () { vec2 st = gl_FragCoord.xy/u_resolution.xy; vec4 color = vec4(st.x,st.y,0.0,1.0); color = texture2D(u_tex0,st); gl_FragColor = color; }把其中的vec2 st换成一个vec3方向、把texture2D(u_tex0, st)换成textureCube(u_cubeTex, dir),就得到了立方体采样的最小骨架。
五、平台限制:iOS 上只能在片段着色器中采样
词条末尾保留了平台约束说明(原文 Side note):
On iOS devices texture lookup functionality is only available in the fragment shader. (在 iOS 设备上,纹理查询功能仅在片段着色器中可用。)
这意味着在 iOS 的 GLSL ES 实现中,顶点着色器里不能调用textureCube(或任何纹理查询函数)。需要纹理结果的逻辑(如按方向预取环境色再传给片段着色器)必须在片段阶段完成,或依赖其他数据通路。这条限制来自词汇总的明确陈述,属于移动端移植立方体贴图效果时的首要检查项。
六、在词汇总中的位置与延伸阅读
- 词条正文(英文):glossary/textureCube/README.md;乌克兰语版:glossary/textureCube/README-ua.md;越南语版:glossary/textureCube/README-vi.md
- 词汇总入口与主题分类:glossary/README.md("TEXTURE LOOKUP FUNCTIONS" 小节列有
texture2D()与textureCube()) - 渲染入口:glossary/index.php(通过 Parsedown 将词条 Markdown 渲染为网页)
- 姊妹词条:glossary/texture2D/README.md
- 采样器类型占位词条:glossary/samplerCube/README.md、glossary/sampler2D/README.md
- 2D 纹理实操章节:15/README.md(纹理上传、
u_tex0Resolution宽高比修正、vec2连续插值特性)
七、小结
textureCube(sampler, coord[, bias])是 GLSL ES 中针对立方体贴图的纹素查询函数:sampler是被绑定纹理的samplerCubeuniform,coord是决定采样"方向"的vec3向量(长度无关,分量绝对值最大者决定命中面),可选的bias在 MIP 层级计算完成之后、实际取色之前叠加,用于主动控制细节层次。它与texture2D共享返回vec4、共享 bias 语义,唯一根本区别是把平面 UV 坐标换成了三维方向坐标——这也正是天空盒与环境反射类效果的底层寻址方式。同时需注意词条声明的平台约束:iOS 上纹理查询只在片段着色器中可用。
【免费下载链接】thebookofshaders
Step-by-step guide through the abstract and complex universe of Fragment Shaders.
相关推荐
The Book of Shaders 词汇表精读:GLSL smoothstep() 平滑 Hermite 插值函数
The Book of Shaders 词汇表精读:GLSL smoothstep 平滑 Hermite 插值函数 本文围绕 The Book of Shade
The Book of Shaders 术语表:GLSL tan() 正切函数详解
The Book of Shaders 术语表:GLSL tan 正切函数详解 本文基于 The Book of Shaders 术语表 glossary 中的
GLSL step() 函数详解:The Book of Shaders 中的阶梯函数与阈值控制
GLSL step 函数详解:The Book of Shaders 中的阶梯函数与阈值控制 step 是 GLSL 内置的硬件加速比较函数,通过比较 x 与
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考