GLSL棋盘图案

San*_*ich 5 glsl

我想用棋子遮挡四边形:

F(P)= [楼层(PX)+地板(PY)]模2.

我的四边形是:

glBegin(GL_QUADS);    
  glVertex3f(0,0,0.0);    
  glVertex3f(4,0,0.0);    
  glVertex3f(4,4,0.0);   
  glVertex3f(0,4, 0.0); 
glEnd();
Run Code Online (Sandbox Code Playgroud)

顶点着色器文件:

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

片段着色器文件是:

varying float factor;
void main(){
  gl_FragColor = vec4(factor,factor,factor,1.0);
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个:

替代文字

似乎mod功能不起作用或者其他东西......任何帮助?

Agn*_*kas 15

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

顶点程序=>

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 );      
}
Run Code Online (Sandbox Code Playgroud)

片段程序=>

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出=>

替代文字

祝好运!


Fen*_*son 5

在片段着色器中试试这个函数:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后在 main 中,您可以使用以下方法调用它:

vec3 check = checker(fs_vertex_texture.x, fs_vertex_texture.y);
Run Code Online (Sandbox Code Playgroud)

只需传递从顶点着色器获得的 x 和 y。之后您要做的就是在计算 vFragColor 时包括它。

请记住,您只需修改 checkSize 值即可更改支票大小。