OpenGL ES2 颜色和纹理着色器

OpenGL ES2 color and texture shader

我想编写一个顶点着色器来处理颜色和纹理我使用了这段代码

precision mediump float;
varying vec4 v_Color;
uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;

void main() {
    gl_FragColor= (v_Color*texture2D(u_TextureUnit, v_TextureCoordinates));
}

它在模型有纹理贴图时有效,但如果模型只有颜色,它会加载黑色,我想在放置 gl_FragColor

之前检查 sampler2D u_TextureUnit

您已经编写了一个从纹理单元读取的着色器;您通常应该避免着色器中的条件性,因为它可能会分割执行路径。通常,编译器可以判断出您有条件地执行的操作是否是制服,但您最终可能会在每次设置制服时为重新编译付费。 ES 2 无法反省采样单元的当前属性,因此初步解决方案可能类似于:

uniform bool u_ApplyTexture;
...
if(u_ApplyTexture)
    gl_FragColor = {what you already have};
else
    gl_FragColor = v_Color;

可能作为备选配置文件的无条件备选方案可能是:

uniform float u_TextureWeight;
...
gl_FragColor = v_Color*
                   mix(vec4(1.0), 
                       texture2D(u_TextureUnit, v_TextureCoordinates), 
                       u_TextureWeight);

u_TextureWeight0.0 时计算为 v_Color*vec4(1.0),当 u_TextureWeight1.0 时计算为 v_Color*texture2D(u_TextureUnit, v_TextureCoordinates)

如果你真的想变黑,你可以将你的纹理作为负片图像上传,然后在着色器中再次将它们负片:

gl_FragColor = v_Color*(vec4(1.0) - texture2D(u_TextureUnit, v_TextureCoordinates));

那么很明显,如果你从采样单元中得到 vec4(0.0) 因为没有附加纹理,那么最终会将 v_Color 乘以 1.0