【问题标题】:Should I write logic in fragment shader in this case?在这种情况下,我应该在片段着色器中编写逻辑吗?
【发布时间】:2019-01-20 19:57:40
【问题描述】:

我有 3 个对象:

  • 立方体1
  • 立方体2
  • 立方体3

我要画画:

  • cube1red(1,0,0),
  • cube2texture1
  • cube3texture2

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

FragColor = Color*texture2D(u_texture, TextureCoordinates)

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

【问题讨论】:

  • 如果您不想切换着色器,则创建一个具有单一(白色)颜色的 1x1 纹理并将其用于统一颜色的立方体。绑定纹理比更改程序“便宜”得多。
  • 谢谢...如果您回复,我可以将其标记为答案。我认为切换着色器对我来说更容易。

标签: glsl webgl


【解决方案1】:

创建具有单一(白色)颜色的 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); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 2011-01-17
    • 2022-07-22
    • 1970-01-01
    • 2011-10-26
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多