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_TextureWeight
为 0.0
时计算为 v_Color*vec4(1.0)
,当 u_TextureWeight
为 1.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
。
我想编写一个顶点着色器来处理颜色和纹理我使用了这段代码
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
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_TextureWeight
为 0.0
时计算为 v_Color*vec4(1.0)
,当 u_TextureWeight
为 1.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
。