在这种情况下,我应该在片段着色器中编写逻辑吗?

时间:2019-01-20 19:57:40

标签: glsl webgl

我有3个对象:

  • cube1
  • cube2
  • cube3

我想画:

  • cube1 作为 red(1,0,0)
  • cube2 texture1
  • cube3 texture2

在片段着色器中,我使用了

FragColor = Color*texture2D(u_texture, TextureCoordinates)

像往常一样,但是此代码还用纹理颜色绘制了我的第一个立方体,我希望它仅是红色。因此颜色混在一起。我的问题是我应该在片段着色器中编写逻辑以分开这些情况吗?

1 个答案:

答案 0 :(得分:2)

创建具有单一(白色)颜色的1x1纹理并将其用于均匀的彩色立方体。 绑定和使用此纹理比更改着色器程序更“便宜”:

let whiteTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, whiteTexture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE,
              new Uint8Array([255,255,255,255]));
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);

请注意,对此纹理(texture2D(u_texture, TextureCoordinates))的查找将始终返回vec4(1.0)

如果纹理被绑定(绑定到分配给u_texture的纹理单元),则

FragColor = Color * texture2D(u_texture, TextureCoordinates);

将设置与片段相同的颜色

FragColor = Color * vec4(1.0);