GLSL棋盘图案 [英] GLSL Checkerboard Pattern

查看:59
本文介绍了GLSL棋盘图案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用方格阴影四边形:

i want to shade the quad with checkers:

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

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

我的四边形是:

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

顶点着色器文件:

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

片段着色器文件为:

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

但是我得到了这个:

似乎mod函数无法正常工作,或者还有其他功能…… 有帮助吗?

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

推荐答案

最好在片段着色器中计算这种效果,如下所示:

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

顶点程序=>

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 );      
}

片段程序=>

#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;
}

输出=>

祝你好运!

这篇关于GLSL棋盘图案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆