Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl x坐标模2==1.0需要不同的颜色_Glsl_Shader - Fatal编程技术网

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

Glsl x坐标模2==1.0需要不同的颜色,glsl,shader,Glsl,Shader,我需要编写一个着色器,当以下等式为真时,像素的颜色为黑色: (像素的x坐标)模2==1 如果为false,则像素应为白色。因此,我搜索了网络,但它没有工作 更多信息: 我有一个分辨率为800x600的OpenGL场景和里面的茶壶。茶壶是红色的。现在我需要创造斑马的样子。 以下是我编写的一些代码,但不起作用: 碎片着色器: void main(){ if (mod(gl_FragCoord[0].x * 800.0 , 2.0) == 0){ gl_FragColor =

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

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

如果为false,则像素应为白色。因此,我搜索了网络,但它没有工作

更多信息: 我有一个分辨率为800x600的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)范围内,因此我需要与宽度相乘。

有趣的是,您提到需要与宽度相乘,您是否尝试过不使用
*800.0
gl\u FragCoord
的范围使得相邻像素之间的距离为1.0,例如
[0.0800.0]
或可能
[0.5800.5]


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

有趣的是,您提到需要使用宽度乘法,您是否尝试过不使用
*800.0
gl\u FragCoord
的范围使得相邻像素之间的距离为1.0,例如
[0.0800.0]
或可能
[0.5800.5]


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

不要直接与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\u FragCoord
在窗口坐标中指定,其中:

。。。缩放和转换的结果已标准化 视口中的设备坐标。glViewport()的参数和 gldepsrange()控制此转换。使用视口,您可以 将标准化设备坐标立方体映射到计算机中的任何位置 窗口和深度缓冲区


因此,您实际上也不想乘以800-输入的坐标已经以像素为单位。

与其直接与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\u FragCoord
在窗口坐标中指定,其中:

。。。缩放和转换的结果已标准化 视口中的设备坐标。glViewport()的参数和 gldepsrange()控制此转换。使用视口,您可以 将标准化设备坐标立方体映射到计算机中的任何位置 窗口和深度缓冲区


因此,您实际上也不想乘以800-输入的坐标已经是像素。

您的代码中有一个隐式类型强制转换:
mod
返回一个与整数比较的浮点值。这可能就是问题所在!尝试显式类型转换,例如:
if(mod(int(gl_FragCoord[0].x*800.0),2)==0){
不是问题所在……但现在警告消失了-谢谢你的回答,马克的答案当然是正确的-为我没有立即注意到这一点感到羞愧!我应该删除我以前的(误导性的)吗注释?您的代码中有一个隐式类型转换:
mod
返回一个与整数比较的浮点值。这可能是问题所在!请尝试显式类型转换,例如:
if(mod(int(gl_FragCoord[0].x*800.0),2)==0){
不是问题所在……但现在警告被否认了——谢谢你的回答,马克的回答当然是正确的——我真为没有立即注意到这一点感到羞耻!我应该删除我以前的(误导性)评论吗?