0

当以下等式成立时,我需要编写一个像素颜色为黑色的着色器:

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

如果它是假的,像素应该是白色的。因此,我搜索了网络,但没有成功。

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

片段着色器:

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

顶点着色器:

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

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

4

2 回答 2

3

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

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

于 2012-07-10T21:20:47.607 回答
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 - 传入的坐标已经以像素为单位。

于 2012-07-10T21:27:30.667 回答