Colors 在WebGL中同时具有纹理和颜色着色器

Colors 在WebGL中同时具有纹理和颜色着色器,colors,webgl,textures,Colors,Webgl,Textures,假设我想要两个不同的形状——一个带有颜色缓冲区,另一个带有纹理缓冲区,既然教程让你几乎只能有一个或另一个,但不能两者都有,我该如何在着色器中编写代码呢 就像在下面的代码中一样,我在另一行代码中为纹理和蓝色做了一些东西-我如何在这种语言中进行区分-我尝试使用int来表示两者之间的选择,但效果不是很好 <script id="shader-fs" type="x-shader/x-fragment"> precision mediump float; varying vec2

假设我想要两个不同的形状——一个带有颜色缓冲区,另一个带有纹理缓冲区,既然教程让你几乎只能有一个或另一个,但不能两者都有,我该如何在着色器中编写代码呢

就像在下面的代码中一样,我在另一行代码中为纹理和蓝色做了一些东西-我如何在这种语言中进行区分-我尝试使用int来表示两者之间的选择,但效果不是很好

<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>

精密中泵浮子;
可变向量2 vTextureCoord;
均匀取样器;
真空总管(真空){
gl_FragColor=texture2D(uSampler,vec2(vtexturecord.s,vtexturecord.t));
//gl_FragColor=vec4(0.0,1.0,0.0,1.0);
}

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

  • 您可以编写
    if
    语句或
    ?:着色器中的表达式,以根据某个参数选择其中一个。(听起来您尝试了这个方法,但不知怎的弄错了-我无法从您的问题中判断问题出在哪里。但是,我会避免使用
    int
    参数,除非有特殊需要,因为整数计算不是GPU优化的目标。)

  • 可以将纹理和均匀颜色相乘,并为纹理对象提供白色,为有色对象提供白色纹理。(这类似于经典的“固定函数管道”渲染操作。)

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

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

所有这些以及更多都是解决问题的完美方法。在剩下的程序中,选择最方便的一个。如果您关心性能,那么尝试一下并选择最快的