GLSL棋盘图案

时间:2011-01-14 18:34:32

标签: 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();

顶点着色器文件:

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

但是我得到了这个:

alt text

似乎mod功能不起作用或者其他东西...... 有什么帮助吗?

5 个答案:

答案 0 :(得分:14)

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

顶点程序=>

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

输出=>

alt text

祝你好运!

答案 1 :(得分:3)

你的代码所做的是计算因子4次(每个顶点一次,因为它是顶点着色器代码),然后插入这些值(因为它被写入变化的变量),然后在片段着色器中将该变量输出为颜色

所以它不起作用。您需要直接在片段着色器中进行计算。您可以使用片段着色器中的gl_FragCoord内置变量来获取片段位置。

答案 2 :(得分:3)

在片段着色器中尝试此功能:

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

然后在main中你可以使用:

来调用它
vec3 check = checker(fs_vertex_texture.x, fs_vertex_texture.y);

简单地传递你从顶点着色器得到的x和y。之后您要做的就是在计算vFragColor时包含它。

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

答案 3 :(得分:1)

另一种很好的方法是平铺一个已知的图案(缩小)。假设您有一个方形画布:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    uv -= 0.5; // moving the coordinate system to middle of screen
    // Output to screen
    fragColor = vec4(vec3(step(uv.x * uv.y, 0.)), 1.);
}

上面的代码为您提供了这种模式。 square pattern

下面的代码只需放大 4.5 倍,取小数部分即可将模式重复 4.5 次,结果每行 9 个方格。

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fract(fragCoord/iResolution.xy * 4.5);
    uv -= 0.5; // moving the coordinate system to middle of screen
    // Output to screen
    fragColor = vec4(vec3(step(uv.x * uv.y, 0.)), 1.);
}

square pattern repeated

答案 4 :(得分:0)

我可以提出以下建议:

float result = mod(dot(vec2(1.0), step(vec2(0.5), fract(v_uv * u_repeat))), 2.0);
  • v_uv是紫外线值的vec2,
  • u_repeat是每个轴应重复多少次图案的vec2。
  • 结果为0或1,您可以在混合功能中使用它来提供颜色,例如:
gl_FragColor = mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 1.0) result);