Hi i’m new to GLSL and i’m having a few problems.
I’m trying to create a pair of GLSL Shaders to either use color or texture but i must be doing something wrong.
The problem is that if set uUseTexture to 0 (which should indicate color) it doesn’t work (object is not colored). I know the coloring code works separately, any hints why it does not work using the if statement?
Here is the code:
// Fragment
precision mediump float;
uniform int uUseTexture;
uniform sampler2D uSampler;
varying vec4 vColor;
varying vec2 vTextureCoord;
void main(void) {
if(uUseTexture == 1) {
gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
} else {
gl_FragColor = vColor;
}
}
// Vertex
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
attribute vec2 aTextureCoord;
uniform int uUseTexture;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec4 vColor;
varying vec2 vTextureCoord;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
if(uUseTexture == 1) {
vTextureCoord = aTextureCoord;
} else {
vColor = aVertexColor;
}
Nothing springs to mind immediately glancing over your code, but I’d like to take a moment and point out that this use case can be covered without needing an if statement. For example, let’s treat
uUseTextureas a float instead of an int (you could cast it in the shader but this is more interesting):// Vertex
// Fragment
Now uUseTexture simply acts as a modulator for how much of each color source you want to use. And it’s more flexible in that you could set it to 0.5 and get half texture/half vertex color too!
The thing that may surprise you is that there’s a good likelihood that this is what the shader compiler is doing behind the scenes anyway when you use an if statement like that. It’s typically more efficient for the hardware that way.