0

假设我想要两个不同的形状——一个带有颜色缓冲区,另一个带有纹理缓冲区,我将如何在着色器中编写代码,因为教程使它几乎就像你只能拥有一个或另一个,但不是两个都?

所以就像在下面的代码中一样,我有一些纹理和一些在另一行代码中使颜色变为蓝色的东西——我将如何用这种语言进行区分——我尝试使用整数来象征两者之间的选择,但它没有效果不太好...

<script id="shader-fs" type="x-shader/x-fragment">
     precision mediump float;

varying vec2 vTextureCoord;

uniform sampler2D uSampler;

void main(void) {
    gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));

   // gl_FragColor= vec4(0.0, 1.0, 0.0, 1.0);
}
</script>
4

1 回答 1

1

有很多很多不同的方法可以做到这一点。

  • 您可以在着色器中编写一个if语句或? :表达式,以根据某个参数选择一个或另一个。(听起来你尝试过这个但不知何故弄错了 - 我无法从你的问题中看出问题所在。但是,int除非有特定需要,否则我会避免使用参数,因为整数计算不是什么GPU 进行了优化。)

  • 您可以将纹理和统一颜色相乘,并为带纹理的对象赋予白色,为彩色对象赋予白色纹理。(这就像经典的“固定功能管道”渲染的运作方式。)

  • 您可以使用两种不同的着色器,一种只处理纹理,另一种只处理颜色(并在对象之间切换gl.useProgram)。

  • 您可以只使用纹理,并使用包含所需颜色的 1×1 纹理为对象着色(如果您想要统一的颜色,而不是每个顶点的颜色)。

所有这些以及更多都是解决问题的完美方法。做对你程序的其余部分最方便的那个。如果您担心性能,请尝试它们并选择最快的。

于 2013-06-29T23:49:05.473 回答