我怎样才能使用" discard;"提高性能?

时间:2014-10-11 12:23:05

标签: opengl glsl lwjgl

我想使用着色器来提高我的游戏性能。

enter image description here

正如您所看到的,我正在使用discard函数剪切远离渲染的像素。

然而,由于某种原因,这并没有增加FPS。我有完全相同的5 FPS,我没有任何着色器!较低的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没有改善表现吗?如果它不能,是否有另一种方法可以使不需要的顶点不渲染(或渲染更少的顶点)以提高性能?

1 个答案:

答案 0 :(得分:3)

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

调整投影矩阵的远平面要简单得多,因此不需要的顶点位于渲染框之外。

首先考虑不要为遥远的树木调用glDraw。

你可以举例说明每个岛屿的树木分组,然后每个岛屿检查它是否足够接近树木渲染,如果没有,则不要调用glDraw *。