Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用2个或更多具有不同位置和纹理坐标的纹理?_Javascript_Webgl - Fatal编程技术网

Javascript 如何使用2个或更多具有不同位置和纹理坐标的纹理?

Javascript 如何使用2个或更多具有不同位置和纹理坐标的纹理?,javascript,webgl,Javascript,Webgl,从中学习主题时,发现这两种纹理共享相同的a_位置和a_texCoord,通过使用一个DrawArray调用,它们在屏幕上显示为相同的大小。 这是否可能有不同的位置和纹理坐标,但仍然可以对两个图像进行如下处理:假设u_image0是背景,u_image1是前图像,它可以与背景一起产生屏幕效果,如下所示 precision mediump float; // our textures uniform sampler2D u_image0; uniform sampler2D u_image1;

从中学习主题时,发现这两种纹理共享相同的a_位置和a_texCoord,通过使用一个DrawArray调用,它们在屏幕上显示为相同的大小。 这是否可能有不同的位置和纹理坐标,但仍然可以对两个图像进行如下处理:假设u_image0是背景,u_image1是前图像,它可以与背景一起产生屏幕效果,如下所示

precision mediump float;

// our textures
uniform sampler2D u_image0;
uniform sampler2D u_image1;

// the texCoords passed in from the vertex shader.
varying vec2 v_texCoord0;
varying vec2 v_texCoord1;

void main() {
   vec4 color0 = texture2D(u_image0, v_texCoord0);
   vec4 color1 = texture2D(u_image1, v_texCoord1);
   gl_FragColor = color0 * color1;
}


不可能有不同的位置,因为WebGL一次只绘制一个像素。只有一个gl_位置可设置

每个纹理可能有不同的纹理坐标,或者在片段着色器中计算不同的纹理坐标。比如说

   vec4 color0 = texture2D(u_image0, v_texCoord0);
   vec4 color1 = texture2D(u_image1, v_texCoord0 * 2.0);
现在,第二个图像使用不同的纹理坐标。这个例子可能很傻,但关键是它是你的代码。你可以把任何你想要的数学

   uniform vec2 offset1;
   uniform vec2 offset2;
   uniform vec2 scale1;
   uniform vec2 scale2;

   vec4 color0 = texture2D(u_image0, v_texCoord0 * scale1 + offset1);
   vec4 color1 = texture2D(u_image1, v_texCoord0 * scale2 + offset2);
否则,还可以为每个纹理创建一个顶点着色器,该着色器以不同的纹理坐标传递

attribute vec2 texcoord0;
attribute vec2 texcoord1;

varying vec2 v_texCoord0;
varying vec2 v_texCoord1;

void main() {
  v_texcoord0 = v_texCoord0;
  v_texcoord1 = v_texCoord1;
}
正如上面提到的一样,你的数学内容由你自己决定。添加偏移、比例、完整矩阵或任何您想要的内容

   uniform vec2 offset1;
   uniform vec2 offset2;
   uniform vec2 scale1;
   uniform vec2 scale2;

   vec4 color0 = texture2D(u_image0, v_texCoord0 * scale1 + offset1);
   vec4 color1 = texture2D(u_image1, v_texCoord0 * scale2 + offset2);
允许使用完整的矩阵是很常见的

  vec2 uv = (some4x4Matrix * vec4(texcoord, 0, 1)).xy;
这使您可以平移偏移、缩放甚至旋转纹理坐标

这是