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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值