我正在尝试在OpenGL中编写一个延迟渲染器,该渲染器支持多种材质(不同的光照模型等)和分层材质(不同的材质混合在一起)。
我正在将材料ID以及标准顶点属性g缓冲区写入g缓冲区。在第二阶段(计算照明并将其渲染到屏幕时),如何为每个像素使用不同的着色器?
我考虑过使用计算着色器为每个材质ID制作一个像素列表,然后生成四边形,点以及可能是其中的线条的混合,然后将这些网格读取回CPU并分别使用它们进行渲染材料。我认为这将使网格必须在每个帧中进行读写操作有些慢。
答案 0 :(得分:2)
A。编写一个超级着色器,该着色器根据像素MaterialID属性选择确切的着色器路径。这对于多种材料可能效果很好。该超级着色器可以由几个部分组成,这些部分可以通过编程方式缝合在一起,以简化开发。
B。 减少材料数量。自言自语。
C。在您的G缓冲区中添加更多通道,以存储各种材质参数(例如镜面反射)
D。使用不同的着色器进行多次传递,并使用MaterialID作为一种“模具” ,以在其与材质和着色器匹配时进行渲染,或者使用discard;
来尽快跳过像素。
您也可以结合使用这些解决方案。