定义自己的制服而不是重复使用GLSL中的内置OpenGL变量.为什么?

Pat*_*ski 2 c++ opengl performance glsl

我正在写一个3D图形引擎.

我听说在着色器程序中使用太多的统一变量是不好的,因为它会导致减速.

另一方面,有人说重新使用像gl_TextureMatrix这样的内置变量是一种不好的做法.

我该如何组织创建着色器程序?我应该为每种机制编写大量的制服,还是可以依赖这些内置变量?例如,我应该使用内置的gl_LightSource还是使用光源信息定义自己的统一数组,那么我的场景中可以有更多的灯光?我也知道延迟渲染技术,但我想先做基本的多灯.

或者,哪些内置变量可以重复使用?

每种做法的优点是什么(dis)?

Mat*_*gro 8

我从来没有听说过制服可以减慢着色器的速度,它们就像编译时间常数(或应该是).

关于使用内置变量,不建议使用它们,因为它们在OpenGL 3.0中已弃用,而在OpenGL Core配置文件中,它们不可用.为了可编程性,它们被移除了.您可以根据需要定义自己的变量,这很好.

所以,这只是一个可编程性的问题,如果你正在学习并想要使用它们,它也没关系.


The*_*Saw 5

关键在于,在现代3D图形编程中,API对如何绘制场景以及将更多控件转移给开发人员的假设较少.OpenGL和Direct3D都是如此.当然,大多数场景使用顶点,颜色,法线,纹理坐标等,这些都导致了固定的管道.但是,如果我想拥有粒子引擎的起始位置和速度怎么办?这会将重力和时间放入统一变量中.

因此,要回答您的问题,假设您想要进入现代图形开发,请停止使用任何预定义的制服并定义您自己的所有制服.从OpenGL 3开始,预定义的制服无论如何都会消失,它依赖于你准确定义渲染场景所需的内容.对于固定管道的退伍军人来说,这通常感觉就像倒退了一步."什么?我已经实现了工作正常的矩阵???" 然而,当他们发现他们不再需要制作500个不同的glEnable调用来准备渲染时,他们很快发现这会带来很大回报.着色器程序精确定义了绘制场景的方式.

简而言之,生活在两个世界中都是一个坏主意(使用着色器和所有固定管道功能).如果固定管道完成了您需要做的所有事情,请坚持使用OpenGL 2,并按照您目前熟悉的方式完成工作.如果您需要高级渲染技巧,请深入了解OpenGL 3+,永不回头.