GLSL 内置函数

texture2D()

在给定的 0 到 1 坐标处读取图片(纹理)的颜色。先改变坐标再读取,就能实现扭曲、滚动和平铺等效果。

函数签名

vec4 texture2D(sampler2D sampler, vec2 coord)
vec4 texture2D(sampler2D sampler, vec2 coord, float bias)

参数

sampler
纹理,用 uniform sampler2D 声明。
coord
读取的位置:(0, 0) 是左下角,(1, 1) 是右上角。
bias
可选的 mipmap 层级偏移,很少用到。

返回值

一个 vec4 颜色(红、绿、蓝、透明度),每个分量在 0.0 到 1.0 之间。

在线示例

修改右侧代码,左侧预览会实时更新。

工作原理

纹理是 GPU 可以读取的一张图片。texture2D(sampler, coord) 返回位置 coord 处的颜色,(0.0, 0.0) 是图片左下角,(1.0, 1.0) 是右上角。

关键在于读取之前先改变 coord:

坐标效果
uv原样显示
uv + offset平移
fract(uv * 2.0)重复 2 x 2
uv + sin(...) * 0.01波浪扭曲

示例上半部分做了波浪扭曲,下半部分做了平铺。

本页的在线示例会提供一张测试图作为 u_texture。在 Playground 中,需要在纹理面板上传图片,并把它的 uniform 名改成 u_texture(默认叫 u_texture0)。

常见用法

  • 后期处理:读取渲染好的画面,再做模糊、调色或扭曲。
  • 图片特效:水波纹、像素化(floor(uv * n) / n)、色差(在略微不同的坐标分别读取 r、g、b)。
  • 查找表:把渐变或噪声存进纹理,直接读取而不是实时计算。

常见错误

  • 写成 texture 而不是 texture2D。WebGL 1(GLSL ES 1.00)中函数名是 texture2D,texture 只在 WebGL 2 中存在。
  • 坐标超出 0 到 1。得到什么取决于环绕模式:重复、夹紧到边缘或镜像。
  • 图片上下颠倒。图片文件从左上角开始,GL 纹理从左下角开始;如果图片倒了,用 1.0 - uv.y 翻转。

相关函数