繁体   English   中英

如何将纹理放置在特定位置?

[英]How to place a texture in a specific location?

在我的代码中,我混合了两种纹理。 我想在平面上的任何位置放置纹理,但是当我向纹理 UV XY 坐标添加偏移时,图像只会被拉伸。

offsetText1 = vec2(0.1,0.1);       
vec4 displacement  = texture2D(utexture1,vUv+offsetText1);

如何在不拉伸的情况下将纹理移动到任何位置?

顶点着色器:

  
  varying vec2 vUv;
  uniform sampler2D utexture1;
  uniform sampler2D utexture2;
  varying vec2 offsetText1;

  void main() {
      offsetText1 = vec2(0.1,0.1);
      vUv = uv;
      vec4 modelPosition = modelMatrix * vec4(position, 1.0);
      vec4 displacement  = texture2D(utexture1,vUv+offsetText1);
      vec4 displacement2 = texture2D(utexture2,vUv);
      modelPosition.z   += displacement.r*1.0;
      modelPosition.z   += displacement2.r*40.0;
      gl_Position       = projectionMatrix * viewMatrix * modelPosition;
  }
  

片段着色器:

  #ifdef GL_ES
  precision highp float;
  #endif
  uniform sampler2D utexture1;
  uniform sampler2D utexture2;
  varying vec2 vUv;
  varying vec2 offsetText1;

  void main() {
      vec3 c;
      vec4 Ca = texture2D(utexture1,vUv+offsetText1 );
      vec4 Cb = texture2D(utexture2,vUv);
      c       = Ca.rgb * Ca.a + Cb.rgb * Cb.a * (2.0 - Ca.a);
      gl_FragColor = vec4(c, 1.0);
  }
  

带有offsetText1 = vec2(0.0,0.0); 没有拉伸

带有offsetText1 = vec2(0.1,0.1); 图像从右上角被拉伸。 拉伸

这就是纹理的行为。 它们在[0, 1]的范围内扩展,因此当您超过 1 或低于 0 时,它们将“换行”。 您需要告诉它在包装时要做什么。 您希望它重复、拉伸还是镜像?

您可以使用texture.wrapS.wrapT属性来建立它,它们接受 3 个值之一:

THREE.RepeatWrapping
THREE.ClampToEdgeWrapping
THREE.MirroredRepeatWrapping

如果您只想在纹理超出范围的地方显示白色,那么您必须在着色器代码中以编程方式执行此操作。 这是一些伪代码:

if (uv < 0 || > 1)
   color = white

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM