我怎样才能使用像“放弃;”这样的命令来提高性能?

e1xvtsh3  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(108)

我想使用着色器来提高我在游戏中的表现。

如您所见,我使用discard函数将远处的像素从渲染中剔除。

然而,出于某种原因,这并没有增加FPS。我得到了完全相同的5FPS,就像我没有任何着色器一样!低FPS是因为我选择渲染绝对吨的树,但因为它们看不到…那他们为什么要造成滞后呢!?

我的片段着色器代码:

varying vec4 position_in_view_space;
uniform sampler2D color_texture;

void main()
{
   float dist = distance(position_in_view_space, 
      vec4(0.0, 0.0, 0.0, 1.0));
   if (dist < 1000.0)
   {
       gl_FragColor = gl_Color;
         // color near origin
   }
   else
   {
      //kill;
      discard;
      //gl_FragColor = vec4(0.3, 0.3, 0.3, 1.0); 
         // color far from origin
   }
}

我的顶点着色器代码:

varying vec4 position_in_view_space;

void main()
{
   gl_TexCoord[0] = gl_MultiTexCoord0;
   gl_FrontColor = gl_Color;
   position_in_view_space = gl_ModelViewMatrix * gl_Vertex;
      // transformation of gl_Vertex from object coordinates 
      // to view coordinates;

   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

}

(我已经对地形纹理的碎片着色器进行了非常轻微的修改,并为树木设置了较低的距离(屏幕截图中的船离树木太远了),但这基本上是相同的想法。)

那么,谁能告诉我为什么discard没有提高性能?如果不能,是否有其他方法可以使不需要的顶点不渲染(或在更远的地方渲染更少的顶点)以提高性能?

tez616oj

tez616oj1#

使用discard实际上会阻止GPU在调用片段着色器之前使用深度缓冲区。

调整投影矩阵的远平面要简单得多,这样不需要的顶点就会在渲染框之外。

还可以考虑从一开始就不要为远处的树调用glDraw。

例如,您可以按岛对树进行分组,然后按岛检查它是否足够近,以便树木可以渲染,如果不是,则不调用glDraw*。

相关问题