GLSL быстрый экран - PullRequest
       7

GLSL быстрый экран

0 голосов
/ 19 февраля 2019

Я работаю в 2D на полном экране, текстурируя квадрат.

Я делю каждую строку на несколько 5-пиксельных пробелов.Только один пиксель на 5 - белый, остальные - черные.Этот шаблон повторяется по всей линии, в каждой строке.

Итак, если 1 - белый, а 0 - черный:

1-й проход = 10000 10000 10000 и т. Д. На всей строке, и каждыйлинии.

2-й проход = 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 (), которые я пытался безуспешно (я тонкоk Я не совсем понимаю эти две функции.)

Вот мой код, который работает:

код шейдера:

#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();
}

1 Ответ

0 голосов
/ 20 февраля 2019

Я думаю, что вы можете использовать что-то вроде:

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

Будьте осторожны, в некоторых реализациях вы не должны давать отрицательные значения mod.В этом случае просто добавьте +Xmax в конце первого параметра mod.

...