GLSL快速屏幕模式

问题描述 投票:1回答:1

我通过纹理四边形在全屏幕上工作。

我将每一行划分为多个5像素空间。 5上只有一个像素是白色,其他像素是黑色。在每条线的整个线上重复该模式。

因此,如果1为白色,0为黑色:

第1遍= 10000 10000 10000等在整行,每行。

第二遍= 01000 01000 01000等

第3遍= 00100 00100 00100等

第4次通过= 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();
}
algorithm optimization glsl modulo
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.