我想使用着色器来提高我的游戏性能。
正如您所看到的,我正在使用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
没有改善表现吗?如果它不能,是否有另一种方法可以使不需要的顶点不渲染(或渲染更少的顶点)以提高性能?
答案 0 :(得分:3)
使用dispose实际上会阻止GPU在调用片段着色器之前使用深度缓冲区。
调整投影矩阵的远平面要简单得多,因此不需要的顶点位于渲染框之外。
首先考虑不要为遥远的树木调用glDraw。
你可以举例说明每个岛屿的树木分组,然后每个岛屿检查它是否足够接近树木渲染,如果没有,则不要调用glDraw *。