GLSL快速屏幕图案

时间:2019-02-19 12:17:02

标签: algorithm optimization glsl modulo

通过对四边形进行纹理处理,我可以在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();
}

1 个答案:

答案 0 :(得分:1)

我认为您可以使用类似:

return vec4(1.0f - step(0.5f,mod(gl_FragCoord.x-step_x+1, Xmax)));

请注意,在某些实现中,不应为mod赋予负值。在这种情况下,只需在第一个参数+Xmax的末尾添加mod

相关问题