返回

超越表面:深入 WebGL 纹理的 WRAP 与多纹理奥秘

前端

揭开 WRAP 的神秘面纱

纹理的 WRAP 模式决定了纹理坐标超出行范围后的行为。共有三种 WRAP 模式:

  • CLAMP_TO_EDGE: 将纹理坐标限制在纹理范围之内,超出范围则以边缘像素颜色填充。
  • REPEAT: 重复纹理,超出范围后从纹理另一端继续。
  • MIRRORED_REPEAT: 重复纹理,超出范围后镜像重复。

WRAP 实战

const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl');

const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);

上面的代码设置了纹理的水平(S)和垂直(T)WRAP 模式为 REPEAT 和 MIRRORED_REPEAT。

掌握多纹理的强大

多纹理允许在一个着色器中使用多个纹理。这对于创建更复杂的着色效果至关重要,例如凹凸贴图和法线贴图。

多纹理着色器代码

#version 300 es

precision mediump float;

in vec3 position;
in vec2 uv;

uniform sampler2D tex1;
uniform sampler2D tex2;

out vec4 fragColor;

void main() {
  vec4 color1 = texture(tex1, uv);
  vec4 color2 = texture(tex2, uv);

  fragColor = color1 * color2;
}

在这个着色器中,我们使用了两个纹理 tex1 和 tex2,并将其乘以一起作为最终颜色。

实例演示

多纹理应用示例

  • 凹凸贴图: 使用多纹理创建逼真的凹凸效果。
  • 法线贴图: 通过存储法线向量,增强表面的细节和深度。
  • 漫反射贴图: 模拟表面上的光照效果。
  • 高光贴图: 添加高光反射和镜面效果。

总结

通过深入理解纹理的 WRAP 和多纹理选项,您可以提升 WebGL 项目的渲染质量和视觉效果。这些技术为纹理映射、着色器编写和图像处理提供了丰富的可能性。把握这些概念,将解锁 WebGL 开发的无限可能。