我通过纹理四边形在全屏幕上工作。
我将每一行划分为多个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();
}
我想你可以使用类似的东西:
return vec4(1.0f - step(0.5f,mod(gl_FragCoord.x-step_x+1, Xmax)));
请注意,在某些实现中,您不应该给mod
赋予负值。在这种情况下,只需在+Xmax
第一个参数的末尾添加mod
。