当下面的等式为真时,我需要写一个着色器,其中像素的颜色为黑色:
(像素的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)内,因此我需要乘以宽度。
答案 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 - 传入的坐标已经是像素。