2011-01-14 151 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大小。