如何在没有片段着色器的情况下在 OpenGL 中实现阈值效果?
How to achieve a threshold effect in OpenGL without fragment shaders?
我想混合函数是可能的。
阈值:所有颜色低于阈值的像素归零;其他人去一个。
这是基本代码。
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()
想要的结果:
threshold
这是可能的,但不会很有趣,并且需要通过几次。如果您知道在顶部绘制的正方形顶点的基础颜色值,则将这些颜色值泵入您正在绘制的正方形的 alpha 颜色通道。如果您无法确定这些颜色值,那您就不走运了。
然后您可以使用 glAlphaFunc 并启用 GL_ALPHA_TEST。这可用于将绘图限制为给定阈值以下的 alpha 值。就其本身而言,这不会非常有用(因为绘制的四边形将具有与下面的渐变相匹配的插值颜色值)。但是,如果您不绘制几何图形,而是写入模板缓冲区,您将拥有四边形一半的模板引用。 Re-draw 四边形(作为黑色四边形),这次将模板测试设置为仅在模板参考匹配时通过。这将处理四边形的一半。
现在清除模板缓冲区,将 alpha 测试设置为仅在 alpha 超过 给定阈值时绘制,并对四边形的后半部分重复上述步骤 (白色位)。
这将非常严峻,相当令人费解,但它会起作用。不过,在片段着色器中做同样的事情只需要大约 4 或 5 行代码。
我想混合函数是可能的。
阈值:所有颜色低于阈值的像素归零;其他人去一个。
这是基本代码。
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()
想要的结果: threshold
这是可能的,但不会很有趣,并且需要通过几次。如果您知道在顶部绘制的正方形顶点的基础颜色值,则将这些颜色值泵入您正在绘制的正方形的 alpha 颜色通道。如果您无法确定这些颜色值,那您就不走运了。
然后您可以使用 glAlphaFunc 并启用 GL_ALPHA_TEST。这可用于将绘图限制为给定阈值以下的 alpha 值。就其本身而言,这不会非常有用(因为绘制的四边形将具有与下面的渐变相匹配的插值颜色值)。但是,如果您不绘制几何图形,而是写入模板缓冲区,您将拥有四边形一半的模板引用。 Re-draw 四边形(作为黑色四边形),这次将模板测试设置为仅在模板参考匹配时通过。这将处理四边形的一半。
现在清除模板缓冲区,将 alpha 测试设置为仅在 alpha 超过 给定阈值时绘制,并对四边形的后半部分重复上述步骤 (白色位)。
这将非常严峻,相当令人费解,但它会起作用。不过,在片段着色器中做同样的事情只需要大约 4 或 5 行代码。