Opengl纹理采样
纹理采样(Texture Sampling)详解
纹理采样 是在着色器中使用纹理坐标,从纹理中获取对应像素颜色值(texel)的过程。它是计算机图形学中实现真实感图像、细节贴图、光照等效果的核心技术之一。
🧱 基本概念
-
纹理(Texture):一个图像,通常为 2D,但也可以是 1D、3D、立方体图等。
-
纹理坐标(UV坐标):二维坐标,通常范围在
[0.0, 1.0]
,用于表示纹理图像中的位置。 -
采样(Sampling):在着色器中根据纹理坐标提取纹理颜色的过程。
✅ GLSL 中常用采样函数
texture()
这是 GLSL 中最常用的采样函数:
vec4 texture(sampler2D tex, vec2 uv);
-
sampler2D tex
:纹理采样器变量,链接到 OpenGL 纹理单元 -
vec2 uv
:纹理坐标,通常传自顶点着色器 -
返回值:一个
vec4
,表示纹理该坐标位置的 RGBA 颜色值
🧪 示例代码(片元着色器)
uniform sampler2D uTexture; // 传入的纹理
in vec2 vTexCoord; // 顶点着色器传来的纹理坐标
out vec4 fragColor;void main() {fragColor = texture(uTexture, vTexCoord); // 执行纹理采样
}
🔍 精度与插值方式(由 OpenGL 控制)
当纹理坐标 不精确对齐某个像素 时,OpenGL 会用以下方式决定采样结果:
设置类型 | 参数值 | 说明 |
---|---|---|
过滤方式(Filter) | GL_NEAREST | 选择最近的 texel |
GL_LINEAR | 插值多个 texel | |
mipmap 过滤 | GL_LINEAR_MIPMAP_LINEAR 等 | 用于缩放时平滑采样 |
🔄 与纹理环绕模式配合
当 UV 坐标超出 [0,1]
时,配合纹理环绕模式决定采样行为:
-
GL_REPEAT
:重复纹理 -
GL_CLAMP_TO_EDGE
:取边缘像素 -
GL_MIRRORED_REPEAT
:镜像重复
📚 进阶采样函数(仅在特定场景使用)
函数名 | 描述 |
---|---|
textureLod() | 指定 mipmap 层级进行采样 |
textureProj() | 投影采样,用于阴影映射等 |
texelFetch() | 以整数像素索引访问纹理,不进行插值 |
textureGrad() | 指定自定义导数采样,用于高质量 mipmap 控制 |
📌 注意事项
-
使用采样器时,需在 CPU 侧绑定纹理到对应的纹理单元:
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID); glUniform1i(glGetUniformLocation(shaderID, "uTexture"), 0); // 对应 GL_TEXTURE0
-
着色器中只能采样在片元着色器、几何着色器、计算着色器等阶段。
-
必须启用对应纹理对象,并设置好环绕和过滤参数。
注:本文参考自chatgpt