在OpenGL中为每个像素使用不同的着色器

在OpenGL中为每个像素使用不同的着色器,opengl,graphics,shader,Opengl,Graphics,Shader,我正在尝试在OpenGL中编写一个延迟渲染器,它支持多种材质(不同的照明模型等)和分层材质(不同的材质混合在一起) 我正在将材质ID写入g缓冲区以及标准顶点属性g缓冲区。如何在第二阶段(计算照明并渲染到屏幕时)为每个像素使用不同的着色器 我考虑使用一个计算着色器为每个材质ID创建一个像素列表,然后从中生成四边形、点和线的混合体,然后将这些网格读回CPU,并使用各自的材质渲染它们。我认为这会有点慢,网格必须在每一帧读取和写入。a.编写一个uber着色器,根据像素MaterialID属性选择精确的着

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

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


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

a.编写一个uber着色器,根据像素MaterialID属性选择精确的着色器路径。这对多种材料都适用。uber着色器可以由编程缝合在一起的几个部分组成,以简化开发

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

C.向g缓冲区添加更多通道,以存储不同的材质参数(例如镜面反射)

D.使用不同的着色器进行多次渲染,并使用MaterialID作为一种“模具”进行渲染(如果材质和着色器匹配),或者
放弃
以尽快跳过像素


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

A.编写一个uber着色器,该着色器基于像素MaterialID属性选择精确的着色器路径。这对多种材料都适用。uber着色器可以由编程缝合在一起的几个部分组成,以简化开发

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

C.向g缓冲区添加更多通道,以存储不同的材质参数(例如镜面反射)

D.使用不同的着色器进行多次渲染,并使用MaterialID作为一种“模具”进行渲染(如果材质和着色器匹配),或者
放弃
以尽快跳过像素


您也可以将这些解决方案结合起来。

应该注意的是,GPU通常不能很好地与动态分支一起工作,并且具有多个分支可能会导致性能降低。@Kromster不会仅仅使用discard仍然很慢,因为我的GPU仍然会光栅化一个全屏四元组(200万像素)对于每个材质,仅丢弃90%的像素(我不确定丢弃是如何工作的。如果丢弃更多像素,渲染不会仍然需要相同的时间,因为GPU是一个并行处理器吗?)。模板是如何工作的?抱歉,如果我问的是非常简单的问题。@CasparValentine,这取决于您的用例。您没有显示任何特定的用例和特定的硬件。因此,我无法发布任何具体答案。测试并尝试!)需要注意的是,GPU通常不能很好地处理动态分支,并且有许多分支会导致性能降低。@Kromster不会仅仅使用discard仍然很慢,因为我的GPU仍然会为每种材质光栅化一个全屏四元(200万像素),只会丢弃90%的像素(我不确定丢弃是如何工作的。如果丢弃更多的像素,渲染不会仍然需要相同的时间,因为GPU是一个并行处理器?)。模具是如何工作的?如果我问的问题非常简单,那就很抱歉了。@这取决于您的用例。您没有显示任何特定的用例和特定的硬件。因此我无法发布任何特定的答案。请测试并重试!)