【问题标题】:Using a different shader for each pixel in OpenGL在 OpenGL 中为每个像素使用不同的着色器
【发布时间】:2018-07-11 06:15:49
【问题描述】:

我正在尝试在 OpenGL 中编写一个延迟渲染器,它支持多种材质(不同的光照模型等)和分层材质(不同的材质混合在一起)。

我正在将材质 ID 写入 g-buffer 以及标准顶点属性 g-buffers。在第二阶段(计算光照并将其渲染到屏幕时)如何为每个像素使用不同的着色器?

我考虑过使用计算着色器为每个材质 ID 制作一个像素列表,然后从中生成四边形、点和线的混合,然后将这些网格读回 CPU 并使用它们各自的渲染它们材料。我认为这会有点慢,必须每帧读取和写入网格。

【问题讨论】:

    标签: opengl graphics shader


    【解决方案1】:

    A.编写一个 uber-shader,根据像素 MaterialID 属性选择精确的着色器路径。这可能适用于多种材料。该超级着色器可以由几个以编程方式拼接在一起的部分组成,以简化开发。

    B. 减少材料数量。不言而喻。

    C.将更多通道添加到您的 g-buffer 以存储不同的材质参数(例如镜面反射)

    D.使用不同的着色器进行多次传递,并使用 MaterialID 作为一种“模板”在材质和着色器匹配时进行渲染,或者使用discard; 尽快跳过像素。

    您也可以组合这些解决方案。

    【讨论】:

    • 需要注意的是,GPU 通常不能很好地处理动态分支,分支过多会导致性能下降。
    • @Kromster 不只是使用丢弃仍然很慢,因为我的 GPU 仍然会为每种材料光栅化一个全屏四边形(200 万像素),只丢弃 90% 的像素(我不确定丢弃是如何工作的。如果丢弃更多像素,渲染是否仍然需要相同的时间,因为 GPU 是并行处理器?)。模板是如何工作的?对不起,如果我问的是非常简单的问题。
    • @CasparValentine 这一切都取决于您的用例。您没有展示任何特定的用例和特定的硬件。因此我不能发布任何具体的答案。测试并尝试! )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2014-03-05
    相关资源
    最近更新 更多