Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GLSL Checkerboard Pattern

Tags:

glsl

i want to shade the quad with checkers:

f(P)=[floor(Px)+floor(Py)]mod2.

My quad is:

glBegin(GL_QUADS);    
  glVertex3f(0,0,0.0);    
  glVertex3f(4,0,0.0);    
  glVertex3f(4,4,0.0);   
  glVertex3f(0,4, 0.0); 
glEnd();

The vertex shader file:

varying float factor;
float x,y;
void main(){
  x=floor(gl_Position.x);
  y=floor(gl_Position.y);
  factor = mod((x+y),2.0);
}

And the fragment shader file is:

varying float factor;
void main(){
  gl_FragColor = vec4(factor,factor,factor,1.0);
}

But im getting this:

alt text

It seems that the mod function doeasn't work or maybe somthing else... Any help?

like image 313
Sanich Avatar asked Jan 14 '11 18:01

Sanich


2 Answers

It is better to calculate this effect in fragment shader, something like that:

vertex program =>

varying vec2 texCoord;

void main(void)
{
   gl_Position = vec4(gl_Vertex.xy, 0.0, 1.0);
   gl_Position = sign(gl_Position);
    
   texCoord = (vec2(gl_Position.x, gl_Position.y) 
             + vec2(1.0)) / vec2(2.0);      
}

fragment program =>

#extension GL_EXT_gpu_shader4 : enable
uniform sampler2D Texture0;
varying vec2 texCoord;

void main(void)
{
    ivec2 size = textureSize2D(Texture0, 0);
    float total = floor(texCoord.x * float(size.x)) +
                  floor(texCoord.y * float(size.y));
    bool isEven = mod(total, 2.0) == 0.0;
    vec4 col1 = vec4(0.0, 0.0, 0.0, 1.0);
    vec4 col2 = vec4(1.0, 1.0, 1.0, 1.0);
    gl_FragColor = (isEven) ? col1 : col2;
}

Output =>

alt text

Good luck!

like image 114
Agnius Vasiliauskas Avatar answered Sep 18 '22 16:09

Agnius Vasiliauskas


Try this function in your fragment shader:

vec3 checker(in float u, in float v)
{
  float checkSize = 2;
  float fmodResult = mod(floor(checkSize * u) + floor(checkSize * v), 2.0);
  float fin = max(sign(fmodResult), 0.0);
  return vec3(fin, fin, fin);
}

Then in main you can call it using :

vec3 check = checker(fs_vertex_texture.x, fs_vertex_texture.y);

And simply pass x and y you are getting from vertex shader. All you have to do after that is to include it when calculating your vFragColor.

Keep in mind that you can change chec size simply by modifying checkSize value.

like image 22
Fengson Avatar answered Sep 18 '22 16:09

Fengson