Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在没有片段着色器的情况下在OpenGL中实现阈值效果?_Python_Opengl_Pyglet - Fatal编程技术网

Python 如何在没有片段着色器的情况下在OpenGL中实现阈值效果?

Python 如何在没有片段着色器的情况下在OpenGL中实现阈值效果?,python,opengl,pyglet,Python,Opengl,Pyglet,我想这是可能的混合函数 阈值:所有颜色低于阈值的像素归零;其他人去一个 这是一个基本代码 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

我想这是可能的混合函数

阈值:所有颜色低于阈值的像素归零;其他人去一个

这是一个基本代码

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()
预期结果:

这是可能的,但不会有太多乐趣,需要几次传球。如果您知道在顶部绘制的正方形顶点处的基本颜色值,则将这些颜色值泵入正在绘制的正方形的alpha颜色通道。如果你不能确定这些颜色值,那你就倒霉了

然后可以使用glAlphaFunc并启用GL_ALPHA_测试。这可用于将图形限制为给定阈值下的alpha值。就其本身而言,这不是很有用(因为绘制的四边形将具有与下面的渐变相匹配的插值颜色值)。但是,如果不绘制几何体,而是写入模具缓冲区,则将为四边形的一半创建模具参考。重新绘制四边形(作为黑色四边形),这一次将模具测试设置为仅在模具参考匹配时通过。那会照顾到四分之一的人

现在清除模具缓冲区,将alpha测试设置为仅在alpha超过给定阈值时绘制,并对四边形的后半部分(白色位)重复上述步骤


这将是相当严峻的,相当复杂的,但它会起作用。不过,在片段着色器中执行相同的操作只需要大约4或5行代码

为什么要在没有着色器的情况下执行此操作?我看不到任何明显的方法来单独混合。使用寄存器组合器和查找纹理当然是可能的,也许还有一些过火的技巧,人们可能会从帽子里拿出,但我真的想不出一个。没有着色器,因为今天的pyglet不再支持。仅在下一版本中。混合似乎很有用,但如果你有其他想法,告诉我me@Marco这不能通过混合实现,因为混合不是比较某些值的测试。混合定义了一个函数,该函数根据帧缓冲区的当前颜色和片段的新颜色计算颜色。@rabbi76,实际上,我有预感,人们可能会以某种方式利用默认值[0,1]钳位结合加减混合函数和多次传递来实现某种阈值函数。然而,这并不能直接解决问题。我不会完全排除这种可能性(也不会说这是可能的),但我只是不想花更多的精力去思考这个问题,因为我不想因为完全过时的图形API而把时间浪费在这种完全人为的挑战上。