algorithm - GLSL 快速屏幕模式

标签 algorithm optimization glsl modulo

我通过对四边形进行纹理化来在全屏上进行 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

关于algorithm - GLSL 快速屏幕模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54766151/

相关文章:

mysql - 选择将 X 连接到 Y 比将 Y 连接到 X 快十倍——这是为什么?

glsl - glsl片段着色器中的特定坐标输出?

algorithm - 如何找到遗传算法的 "Crossover"运算符?

algorithm - 为什么此代码中需要这一行才能从 BST 中删除?

algorithm - 图灵机和密码

c# - 您如何使该switch语句尽可能快?

python - 将扁平高斯模型拟合到给定数据

python - 使用 DFS 搜索图形时出现 KeyError

c++ - 后处理窗口视频输出

iphone - 为什么我的应用程序中着色器的路径为零?