☰
The Book of Shaders 词汇总解:GLSL 中 textureCube 立方体贴图采样函数详解
2026/10/16 2:55:25 网站建设 项目流程

【免费下载链接】thebookofshaders

Step-by-step guide through the abstract and complex universe of Fragment Shaders.

项目地址:https://gitcode.com/gh_mirrors/th/thebookofshaders
点击查看免费下载

本文基于 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)的描述可以概括为三点:

  1. 函数返回一个纹素,即给定坐标处纹理的(颜色)值;
  2. 第一个入参类型是samplerCube(纹理绑定所在的 uniform 采样器),第二个入参类型是vec3(要查询的纹素的三维坐标);
  3. 存在一个可选的第三个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 typefloat. 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)
维度texture2DtextureCube
采样器类型sampler2DsamplerCube
坐标类型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.

项目地址:https://gitcode.com/gh_mirrors/th/thebookofshaders
点击查看免费下载
上一篇:10分钟上手Pup:从auth login到第一条监控命令,新手避坑清单
下一篇:k-skill 技能解析:saramin-talent-search——사람인 인재풀登录会话中的候选人检索、评分与付费阅读前短名单构建

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询