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