2011-01-14 65 views
4

我想树荫跳棋四: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功能doeasn't工作或财产以后也许还有... 任何帮助吗?

+0

有趣。结果显示四边形实际上呈现为两个三角形(topleft/bottomright)。否则,结果将更像一个平滑的棋盘。如果是这样,你可以在你的片段着色器中使用阈值函数来获得合适的棋盘格。实际上,插值对棋盘格效果没有用处。 – 2013-07-18 10:52:18

回答

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

片段节目=>

#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

为什么不使用整数x,y并应用简单的位AND(片段内部不需要除法) – Spektre 2013-09-12 22:25:58

3

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

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

2

试试这个功能在您的片段着色器:

vec3 checker(in float u, in float v) 
{ 
    float checkSize = 2; 
    float fmodResult = mod(floor(checkSize * u) + floor(checkSize * v), 2.0); 

    if (fmodResult < 1.0) { 
    return vec3(1, 1, 1); 
    } else { 
    return vec3(0, 0, 0); 
    } 
} 

然后在主,你可以使用称之为:

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

,只需通过X和Y,你是从顶点着色器获得。所有你需要做的是在计算你的vFragColor时包含它。

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