通过对四边形进行纹理处理,我可以在2D屏幕上全屏工作。
我将每行分成多个5个像素的空间。 5个像素上只有一个像素是白色,其他像素是黑色。 沿着每行的每一行重复此模式。
因此,如果1是白色,而0是黑色:
第一遍= 10000 10000 10000等,整行以及每行。
第二遍= 01000 01000 01000等
第三遍= 00100 00100 00100等
第四次通过= 00010 00010 00010等
第5次通过= 00001 00001 00001等
第6次通过= 10000 | 10000 | 10000(如第1次通过) 等
step_x是白色像素的数量(1到5之间),每次通过都会改变。
换句话说,如果step_x == 2,则白色像素位于第2、7、12、17等列。
如果不使用会减慢执行速度的多个条件,就无法使用模运算。
我需要提高效率,因为我在代码中经常使用它。
这就是为什么我要寻求帮助:如何更有效地获得相同的结果?
也许我尝试过的带有fract()或step()函数的东西都没有成功(我认为我不太了解这两个函数。)
这是我的代码,可以正常工作:
着色器代码:
#version 330 core
out vec4 FragColor;
uniform int step_x;
#define Xmax 5
vec4 white_if_posX_is_Multiple() {
int mod_x = int(mod(gl_FragCoord.x, Xmax));
if (step_x == Xmax && mod_x < 1.0) return vec4(1.0f);
if (mod_x == step_x;) return vec4(1.0f);
return vec4(0.0f);
}
void main()
{
FragColor = white_if_posX_is_Multiple();
}
C ++ OpenGL代码:
glDisable(GL_DEPTH_TEST);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
for (int x = 1; x <= 5; x++) {
glClear(GL_COLOR_BUFFER_BIT);
shader.use();
shader.setInt("step_x", x);
renderQuad();
}
答案 0 :(得分:1)
我认为您可以使用类似:
return vec4(1.0f - step(0.5f,mod(gl_FragCoord.x-step_x+1, Xmax)));
请注意,在某些实现中,不应为mod
赋予负值。在这种情况下,只需在第一个参数+Xmax
的末尾添加mod
。