x坐标模2 == 1.0需要不同的颜色

时间:2012-07-09 08:50:26

标签: glsl shader

当下面的等式为真时,我需要写一个着色器,其中像素的颜色为黑色:

(像素的x坐标)mod 2 == 1

如果为false,则像素应为白色。因此我在网上搜索但是没有用。

更多信息: 我有一个800 x 600分辨率的OpenGL场景和茶壶。茶壶是红色的。现在我需要创建斑马外观。 这是我写的一些代码,但它不起作用:

FragmentShader:

void main(){
    if (mod(gl_FragCoord[0].x * 800.0 , 2.0) == 0){

        gl_FragColor = vec4(1.0,1.0,1.0,1.0);

    }else{
        gl_FragColor = vec4(0.0,0.0,0.0,1.0);
    }
}

VertexShader:

void main(void)
{
    gl_Position = ftransform();
    gl_TexCoord[0]  =   gl_MultiTexCoord0;
}

据我所知,gl_FragCood.x在范围(0,1)内,因此我需要乘以宽度。

2 个答案:

答案 0 :(得分:3)

有趣的是你提到需要乘以宽度,你试过没有* 800.0吗? gl_FragCoord的范围使得相邻像素之间的距离为1.0,例如[0.0, 800.0]或可能[0.5, 800.5]

删除宽度乘法并查看它是否有效。

答案 1 :(得分:1)

不要直接与0比较,而是尝试对1.0进行测试,例如

void main(){
    if (mod(gl_FragCoord[0].x , 2.0) >= 1.0){

        gl_FragColor = vec4(1.0,1.0,1.0,1.0);

    }else{
        gl_FragColor = vec4(0.0,0.0,0.0,1.0);
    }
}

这将避免精确错误和四舍五入的成本。

emackey指出时,gl_FragCoord在窗口坐标中指定,其中:

  

...缩放和翻译规范化的结果   设备通过视口进行坐标。 glViewport()和的参数   glDepthRange()控制这个转换。使用视口,您可以   将规范化设备坐标立方体映射到您的任何位置   窗口和深度缓冲区。

所以你实际上也不想乘以800 - 传入的坐标已经是像素。