GLSL多个shaderprogram

GLSL多个shaderprogram

本文介绍了GLSL多个shaderprogram VS交换机制服的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的着色器架构经理,我有更多的先进人物的几个问题。
我现在的选择反对两种设计,它们是:

I'm working on a shader manager architecture and I have several questions for more advanced people.My current choice oppose two designs which are:


1。每材料着色器程序


=>创建每个程序中使用的物质的一元着色器程序。


1. Per material shader program

=> Create one shader program per material used in the program.


  • 考虑到每个对象都有自己的材料,它涉及到很多glUseProgram来电。

  • 意味着很多shaderprogram对象的创建。

  • 更复杂的架构,#2。


  • 可以专门为在材料中使用的每个选项产生的Shader code。

  • 如果我没错,制服必须只设定一个时间(当创建shaderprogram)。


2。全球着色器程序


=>创建每个着色器功能(雷击,反射,视差贴图...)中的着色器程序,然后使用配置变量来启用或丢弃取决于材料选择来呈现。


2. Global shader programs

=> Create one shader program per shader functionality (lightning, reflection, parallax mapping...) and use configuration variables to enable or discard options depending on the material to render.


  • 制服每帧被改变了很多次。


  • 下着色器程序计数。

  • 少SP SWICH(glUseProgram)。


您可能注意到,我目前的趋势是#1,但我想知道你对此事的意见。


You might notice that my current tendency is #1, but I wanted to know your opinion about it.


  • 最初是否设置制服抵消glUseProgram调用的开销(我并不是速度怪胎)?

  • 在情况#1,任何内存或性能的考虑,应该我叫glLinkProgram只有一次,当我创建的SP,或者我必须取消链接/每次我打电话glUseProgram时间链接?

  • 有没有更好的办法呢?

谢谢!

推荐答案

让我们来看看#1:

考虑到每个对象都可能有自己的材料,它涉及到很多glUseProgram来电。

这不是什么大不了的事,真的。交换计划是很难的,但你也可以换的纹理,所以它不喜欢你不是已经改变重要的国家。

This isn't that big of a deal, really. Swapping programs is hard, but you'd be swapping textures too, so it's not like you're not already changing important state.

意味着很多shaderprogram对象的创建。

这会伤害。事实上,与#1的主要问题是着色的炸药组合。虽然ARB_separate_program_objects会有所帮助,但仍然意味着你有写很多着色器,或想出一个办法不写了很多的着色器。

This is going to hurt. Indeed, the main problem with #1 is the explosive combination of shaders. While ARB_separate_program_objects will help, it still means you have to write a lot of shaders, or come up with a way to not write a lot of shaders.

或者你也可以使用,这有助于缓解这一点。在其众多的优点在于,它的材料数据的生成从该变换该材料的数据为光反射率(颜色)的计算分离。正因为如此,你有少得多着色器一起工作。有一组产生材料数据着色器,以及使用该材料的数据做照明计算一组

Or you can use deferred rendering, which helps to mitigate this. Among its many advantages is that it separates the generation of the material data from the computations that transform this material data into light reflectance (colors). Because of that, you have far fewer shaders to work with. You have a set of shaders that produces material data, and a set that uses the material data to do lighting computations.

所以,我要说使用#1延迟渲染。

So I would say to use #1 with deferred rendering.

这篇关于GLSL多个shaderprogram VS交换机制服的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 00:19