中EN
概念页

着色器纹理采样

Shader Texture Sampling

更新于 2026-10-15 约 4 分钟sampler2Dtexture2DUVGLSL图像处理

GPU 把图像存成 sampler2D:一张浮点向量的「表」,坐标连续时硬件做插值。片元里用 texture2D(sampler, uv)(现代 GLSL 为 texture)按归一化 UV 取色。BoS 强调:通道是 [0,1][0,1] 连续域、可越界重复、可用噪声扭曲 UV——图像变成可拉伸的「数码软垫」,为后处理与光学玩具式特效铺路。

从字节数组到 sampler

CPU 上图像常是字节数组;GPU 侧是 sampler2D。上传与把纹理 id 绑到 uniform 发生在着色器之外;着色器内声明 uniform sampler2D u_tex0,再:

vec4 texture2D(sampler2D texture, vec2 coordinates); // 旧式 API 名

返回 vec4 颜色。UV 与全书归一化空间一致,落在 [0,1][0,1](北斋《神奈川冲浪里》示例按全屏 billboard 逐像素采样)。

为何「激动」

  1. 不是 0–255 整数:进入 sampler 后是精度设置下的 [0,1][0,1] 浮点——利于漂亮的后处理;
  2. 连续表面:可问像素之间的位置,值平滑过渡(正确过滤设置下);
  3. 边可重复:UV 越出 [0,1][0,1] 时可 wrap,像无限延伸的布料。

用 噪声函数 扭曲采样坐标,即可在不动原图像素网格观感的前提下做有机变形。

非正方形与分辨率 uniform

方图配方画布简单;摄影与绘画常用非 1:1。框架把宽高传入如 u_tex0Resolution(名字 = 纹理名 + Resolution)。aspect = width/height,常乘到 yy 方向以恢复原图纵横比;再讨论如何居中。

数码软装与光学玩具

把纹理当可折叠织物:缩放、旋转 90°、鼠标拖 UV 都是基本练习。精灵动画让人想起费纳奇镜、西洋镜、普拉克辛镜等早期光学玩具。扩展作业:万花筒;复原立体照片;其它光学玩具的着色器重做。

与本库纹理页的分工

  • 纹理映射管线:投影、寻址、立方体、程序纹理总管线(RTR 视角);
  • 纹理过滤与 Mipmap:放大/缩小、各向异性;
  • 图像处理与后处理:多 pass、邻域卷积等(BoS 后续章多为 stub,原理落在本库此页);
  • 本页:BoS「第一次在片元里采样图片」——sampler2D、归一化 UV、宽高比与 UV 扭曲。

在游戏开发中的意义

  • 全屏后处理的输入就是上一 pass 的颜色附件当 sampler2D;
  • UV 扰动 = 热扭曲、水折射、损坏 CRT;
  • 宽高比处理与 UI / 视频纹理常见坑相同。

LearnOpenGL 的视角:OpenGL 采样器、环绕与纹理单元(Getting Started / Textures)

来源:Textures;摘录 Getting Started — Textures。BoS 侧「第一次 texture(sampler, uv)、宽高比」见上文;噪声/图案仍链 噪声函数、程序化图案,不重复。

纹理坐标与采样

顶点带 UV,片元输入为插值后的 UV;texture(sampler2D, TexCoord) 按过滤参数取纹素。UV 通常在 [0,1],原点约定为左下(与多数图像文件「左上为 0」相反,故 stbi_set_flip_vertically_on_load(true) 常见)。

环绕与过滤(API 侧)

  • 环绕:GL_REPEAT / MIRRORED_REPEAT / CLAMP_TO_EDGE / CLAMP_TO_BORDER(可设边框色),分 TEXTURE_WRAP_S/T。
  • 放大/缩小:GL_NEAREST vs GL_LINEAR;缩小还可选带 mipmap 的四种组合;放大勿设 mipmap 过滤(会 GL_INVALID_ENUM)。
  • glGenerateMipmap 自动生成链式 LOD。理论见 纹理过滤与 Mipmap。

纹理单元与多贴图

sampler2D uniform 存的是纹理单元索引;glActiveTexture(GL_TEXTURE0+i) 后 glBindTexture,再 glUniform1i 把 sampler 设为 i。mix(texture1, texture2, t) 可在片元里混合两张图。默认单元为 0,但部分驱动仍要求显式赋值。

  1. The Book of Shaders: Textures
  2. thebookofshaders.com/15
  3. Getting Started — Textures
  4. learnopengl.com/Getting-started/Textures

相关页面

图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学噪声函数Noise FunctionsKen Perlin 为电影《电子世界争霸战》(Tron) 设计的噪声,解决「看起来随机却不像电视雪花」的程序纹理问题。入门路径是值噪声 (value noise):格子角点取伪随机,格内用平滑曲线插值;进阶有梯度噪声 (gradient noise)、五次插值改进版,以及用单纯形网格降复杂度的 Simplex Noise。图形学图像处理与后处理Image Processing & Post-Processing后处理是在渲染出图像后再用 GPU 对其做图像处理:把离屏缓冲当纹理,用全屏 pass 让像素着色器(或计算着色器)对每个像素采样邻域并加权求和。核心技巧包括可分离滤波、利用双线性插值减少采样、降采样、以及借助深度/法线保持边缘的(联合)双边滤波(RTR4 12.1 节)。图形学片元着色器与 GLSL 基础Fragment Shaders & GLSL Basics片元着色器(fragment shader)是在每个像素(片元)上并行执行的小程序:输入位置等信息,输出颜色。GLSL 是 OpenGL / OpenGL ES / WebGL 共用的着色语言;本书用全屏 billboard 上的像素着色练习,建立程序化图形的基础心智模型。图形学着色器二维矩阵变换2D Matrix Transforms in Shaders在片元里「移动形状」其实是移动坐标系:平移加向量;旋转与缩放用 mat2 乘到坐标上。绕画布中心变换时,要先把空间挪到原点、变换、再挪回。矩阵乘法顺序有关;同一套矩阵也可拿来做 YUV↔RGB 等颜色空间线性变换。图形学着色频率与材质系统Shading Frequency & Material Systems实现着色时要按"计算频率"划分工作:整个 draw call 不变的放到应用端作为 uniform,其余放在相应的可编程阶段。实践中大多数着色在像素级完成,顶点着色器负责变换和变形。材质系统把面向美术的材质与底层着色器组织起来,处理海量着色器变体的组合问题。游戏开发 · UE5Custom 材质表达式Custom Material ExpressionCustom 节点允许在材质图里直接写 HLSL:任意数量输入、指定输出类型,可选额外输出、define 与外部 .ush/.usf 包含路径。它是「内置节点做不到」时的逃生口;代价是无法常量折叠、输入仅函数局部可见、且必须是合法 HLSL。优先用内置节点与材质函数,只在必要时上 Custom。

被这些页面引用3 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原