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

优化片段和顶点着色器之间的操作

邓威
2023-03-14

我正在学习使用OpenGL制作图形引擎。我想知道,重复操作是否应该从顶点着色器移动到片段着色器,因为据我所知,顶点着色器每个顶点只运行一次?

例如,当规格化灯光方向的向量时,由于该灯光在整个顶点中相同,是否应将其移动到顶点着色器,而不是为每个像素计算它?在着色器中保留片段有什么特别的原因?

共有1个答案

高砚
2023-03-14

如果计算完全相同:是的,在顶点着色器中执行通常应该比片段着色器更有效。一些可能效率不高的情况:

>

在顶点着色器中进行计算时,需要向片段着色器发送更多数据,以便使用计算结果。发送更多数据可能会更慢,因为它需要更多的内存操作,而且光栅化器需要在每个多边形上插值更多的“变化”值。

特别是对于灯光计算,请注意,将计算从片段着色器移动到顶点着色器可能会影响渲染质量。特别是,在“变化”插值后,每个顶点处的归一化方向向量可能会变短,如果直接使用而不进行重正化,则会使三角形内部略微变暗。当然,将整个照明计算移动到顶点着色器会产生更剧烈的效果。

但是这些效果的可见程度取决于纹理的频率、几何分辨率、屏幕上的大小、灯光的距离等——在某些情况下,质量/性能的权衡可能是有意义的。

 类似资料:
  • WebGL的着色器代码分为顶点着色器代码和片元着色器代码两部分,顶点着色器代码会在GPU的顶点着色器单元执行,片元着色器代码会在GPU的片元着色器单元执行,在WebGL渲染管线流程中,或者说GPU的渲染流程中,顶点着色器代码先执行处理顶点,得到一系列片元,然后再执行片元着色器代码处理片元。 main()函数 顶点着色器和片元着色器代码都有一个唯一的主函数main(),attribute、varyi

  • 在一个简单的hello world OpenGL程序中,它只是在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色、绿色和蓝色时,三角形将填充渐变。 但是当我使用这样的着色器时: 顶点着色器: 其中属性和来自顶点缓冲区,通过的调用传递。 片段着色器: 三角形仍然充满了梯度,问题来了: 如果顶点着色器是按顶点计算的,则应为的每个实例指定顶点的颜色。顶点颜色应为红色、绿色或蓝色,如顶点缓冲区中

  • 我真的不明白片段着色器是如何工作的。 我知道 顶点着色器每个顶点运行一次 片段着色器对每个片段运行一次 由于片段着色器不是按顶点而是按片段工作,它如何将数据发送到片段着色器?顶点的数量和片段的数量不相等。 它如何决定哪个碎片属于哪个顶点?

  • 顶点着色器用来操作ShaderEffect提供的顶点。正常情况下,ShaderEffect有4个顶点(左上top-left,右上top-right,左下bottom-left,右下bottom-right)。每个顶点使用vec4类型记录。为了实现顶点着色器的可视化,我们将编写一个吸收的效果。这个效果通常被用来让一个矩形窗口消失为一个点。 配置场景(Setting up the scene) 首先我

  • 我对OpenGL有点生疏,我已经实现了一个场景的照明,场景中有小行星围绕行星旋转的实例。出于某种原因,我得到的唯一输出似乎是场景的环境照明。我无法使漫反射或镜面反射工作。 这是现场的一张照片(很难看到…)仅限环境 片段着色器代码如下所示。FragPos、Normal和TexCoords都是你所期待的。纹理_diffuse1是行星/小行星纹理,具体取决于使用的着色器。LightPos可以移动,它由图