我想使用着色器来提高我在游戏中的表现。
如您所见,我使用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
没有提高性能?如果不能,是否有其他方法可以使不需要的顶点不渲染(或在更远的地方渲染更少的顶点)以提高性能?
1条答案
按热度按时间tez616oj1#
使用
discard
实际上会阻止GPU在调用片段着色器之前使用深度缓冲区。调整投影矩阵的远平面要简单得多,这样不需要的顶点就会在渲染框之外。
还可以考虑从一开始就不要为远处的树调用glDraw。
例如,您可以按岛对树进行分组,然后按岛检查它是否足够近,以便树木可以渲染,如果不是,则不调用glDraw*。