Как добиться порогового эффекта в OpenGL без фрагментных шейдеров? - PullRequest
0 голосов
/ 19 мая 2019

Полагаю, это возможно с функциями наложения.

Порог: все пиксели с цветами под пороговым значением обнуляются;другие идут к одному.

Вот основной код.

import pyglet
from pyglet.gl import *

# Set the threshold value
threshold = 0.5

# Window creation
window = pyglet.window.Window(500, 500)


@window.event
def on_draw():
    # Draw a square black to white gradient
    pyglet.graphics.draw_indexed(4, pyglet.gl.GL_TRIANGLES, [0, 1, 2, 2, 3, 0],
                                 ('v2i', (100, 100, 100, 400, 400, 400, 400, 100)),
                                 ('c4f', (0, 0, 0, 1) * 2 + (1, 1, 1, 1) * 2))

    # Overlay a small square on top
    glEnable(GL_BLEND)
    glBlendEquation(GL_MAX)
    glBlendFunc(GL_ONE, GL_DST_COLOR)

    pyglet.graphics.draw_indexed(4, pyglet.gl.GL_TRIANGLES, [0, 1, 2, 2, 3, 0],
                                 ('v2i', (200, 200, 200, 300, 300, 300, 300, 200)),
                                 ('c4f', (threshold, threshold, threshold, 1) * 4))


pyglet.app.run()

Желаемый результат: Порог

1 Ответ

1 голос
/ 20 мая 2019

Это возможно, но это не будет очень весело, и потребует несколько проходов. Если вам известны базовые значения цвета в вершинах квадрата, который вы рисуете сверху, то закачайте эти значения цвета в канал альфа-цвета квадрата, который вы рисуете. Если вы не можете определить эти значения цвета, вам не повезло.

Затем вы можете использовать glAlphaFunc и включить GL_ALPHA_TEST. Это может быть использовано для ограничения рисунка альфа-значениями под заданным порогом. Само по себе это не будет очень полезным (так как нарисованный квад будет иметь интерполированные значения цвета, которые соответствуют градиенту внизу). Однако, если вместо рисования геометрии вы будете записывать в буфер трафарета, у вас будет ссылка на трафарет для одной половины квадрата. Повторно нарисовать квад (как черный квад), на этот раз установив тест трафарета, чтобы он проходил только при совпадении с эталонным шаблоном. Это позаботится об одной половине четырехугольника.

Теперь очистите буфер трафарета, настройте альфа-тест на рисование, только когда альфа равен над заданным порогом, и повторите описанные выше шаги для второй половины четырехугольника (белого бита).

Это будет довольно мрачно, довольно запутанно, но это сработает. Чтобы сделать то же самое в фрагментном шейдере, потребуется всего около 4 или 5 строк кода.

...