着色器纹理采样
Shader Texture Sampling
GPU 把图像存成 sampler2D:一张浮点向量的「表」,坐标连续时硬件做插值。片元里用 texture2D(sampler, uv)(现代 GLSL 为 texture)按归一化 UV 取色。BoS 强调:通道是 连续域、可越界重复、可用噪声扭曲 UV——图像变成可拉伸的「数码软垫」,为后处理与光学玩具式特效铺路。
从字节数组到 sampler
CPU 上图像常是字节数组;GPU 侧是 sampler2D。上传与把纹理 id 绑到 uniform 发生在着色器之外;着色器内声明 uniform sampler2D u_tex0,再:
vec4 texture2D(sampler2D texture, vec2 coordinates); // 旧式 API 名
返回 vec4 颜色。UV 与全书归一化空间一致,落在 (北斋《神奈川冲浪里》示例按全屏 billboard 逐像素采样)。
为何「激动」
- 不是 0–255 整数:进入 sampler 后是精度设置下的 浮点——利于漂亮的后处理;
- 连续表面:可问像素之间的位置,值平滑过渡(正确过滤设置下);
- 边可重复:UV 越出 时可 wrap,像无限延伸的布料。
用 噪声函数 扭曲采样坐标,即可在不动原图像素网格观感的前提下做有机变形。
非正方形与分辨率 uniform
方图配方画布简单;摄影与绘画常用非 1:1。框架把宽高传入如 u_tex0Resolution(名字 = 纹理名 + Resolution)。aspect = width/height,常乘到 方向以恢复原图纵横比;再讨论如何居中。
数码软装与光学玩具
把纹理当可折叠织物:缩放、旋转 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_NEARESTvsGL_LINEAR;缩小还可选带 mipmap 的四种组合;放大勿设 mipmap 过滤(会GL_INVALID_ENUM)。 glGenerateMipmap自动生成链式 LOD。理论见 纹理过滤与 Mipmap。
纹理单元与多贴图
sampler2D uniform 存的是纹理单元索引;glActiveTexture(GL_TEXTURE0+i) 后 glBindTexture,再 glUniform1i 把 sampler 设为 i。mix(texture1, texture2, t) 可在片元里混合两张图。默认单元为 0,但部分驱动仍要求显式赋值。