当前位置: 首页 > 知识库问答 >
问题:

两个着色器之间频繁交换造成的OpenGL性能开销

朱毅
2023-03-14

我有一个情况,我有两个特殊的着色器:

第一个着色器从场景中的所有对象投射阴影,并渲染为单个全屏8位阴影纹理。glsl代码非常短。

第二个着色器对g缓冲区执行延迟照明计算,并渲染到单个全屏32位纹理缓冲区。它使用了几种全屏纹理(32位位置、16位法线、32位漫反射、8位镜面反射、8位阴影)。glsl代码也相当冗长。

如您所见,对于每个灯光,这两个着色器必须随后执行。A然后B,A然后B,A然后B。这会导致大量交换。

我读过着色器交换有一些高的相对开销,但我不熟悉GPU如何处理两个着色器之间的交换。

这两个着色器程序是否会被有效地缓存,这应该不是问题?

我应该组合两个着色器并使用glDrawBuffers()指导输出吗?如果我将它们组合起来,从上一个g缓冲区照明阶段加载的5个纹理将在下一个阴影投射阶段保持陈旧,这会导致任何性能开销吗?

共有1个答案

冉昊
2023-03-14

这两个着色器程序是否会被有效地缓存,这应该不是问题?

问题不在于缓存,而在于更改着色器会刷新GPU执行管道。管道和分支预测器需要几十个时钟周期才能适应新切换到的着色器。

我应该组合两个着色器并使用glDrawBuffers()指导输出吗?

在延迟着色器设置中,如果你能做到没有太多问题?当然!

 类似资料:
  • OpenGL的渲染管线分为几个步骤。一个简单的OpenGL渲染管线将包含一个顶点着色器和一个片段着色器。 顶点着色器接收顶点数据,并且在程序最后赋值给gl_Position。然后,顶点将会被裁剪,转换和栅格化后作为像素输出。 片段(像素)进入片段着色器,进一步对片段操作并将结果的颜色赋值给gl_FragColor。顶点着色器调用多边形每个角的点(顶点=3D中的点),负责这些点的3D处理。片段(片度

  • 我似乎无法理解从顶点到像素的OpenGL管道过程。 有人能告诉我顶点法线在这两种着色技术中有多重要吗?据我所知,在gouraud中,在每个顶点计算照明,然后在顶点之间的多边形上插值结果颜色(在光栅化之前,这是在片段操作中完成的吗?),phong着色包括首先插值顶点法线,然后计算每个法线上的照明。 另一件事是,当凹凸贴图应用于一个平面(2个三角形)和一个砖纹理作为漫反射时,使用其相应的凹凸贴图,所有

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

  • 目前,我有问题与传递多个纹理到一个glsl着色器在iOS。 在渲染中,想要的纹理被绑定到制服上 我在这里一直使用GL_TEXTURE0和GL_TEXTURE1,因为当纹理(实际上是来自iPhone摄像头的luma和Chroma纹理,最终用于计算相应的rgb值)被创建时,这些textureLots被使用。 我使用的fragmentshader非常简单,它只是用给定的纹理对一个简单的屏幕填充四方进行纹

  • 我正在写我的学生项目,有一些问题。 我的任务是加载两个大小相同的纹理(图像和灰度掩码),然后应用基于灰度掩码的卷积核模糊滤波器。 提前谢谢你。