GLSL 快速屏幕模式

GLSL fast screen pattern

我通过对四边形进行纹理化来在全屏上进行 2D 工作。

我把每一行分成多个5像素的空间。 5上只有一个像素是白色的,其他都是黑色的。 这种模式在每一行都沿行重复。

所以如果 1 是白色,0 是黑色:

第 1 遍 = 10000 10000 10000 等整行和每行。

第二遍 = 01000 01000 01000 等

第三遍 = 00100 00100 00100 等

第 4 遍 = 00010 00010 00010 等

第 5 遍 = 00001 00001 00001 等

第 6 遍 = 10000|10000|10000(与第 1 遍相同) 等等

step_x是白色像素的个数(在1到5之间),随着pass的变化而变化。

换句话说,如果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();
}

我想你可以使用类似的东西:

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

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