I'm drawing a scene in 3D using per pixel lighting on Android in OpenGL ES 2.0. When I render only a few small objects I get 60 FPS, but if I try to use a landscape to put the objects on, the framerate drops heavily, to about 15 frames. I guess this is because it has to calculate the lighting for all those pixels from the landscape. Is there any way I could optimize this? I wouldn't want to use per vertex lighting on the landscape alone because I would like to cast shadows on it.
2 に答える
上記のコメントから、シェーダーのコードはこれ以上高速化できないと考えており、GPU フィルレートの制限に引っかかっていることがわかります。
この場合、オブジェクトを賢くカリングすることでパフォーマンスを向上させることができます。最初に、高速で単純なシェーダーを使用し、ランドスケープ オブジェクトを遮る最も近いオブジェクトを描画します (ピクセル単位の照明に複雑なシェーダーを使用します)。このようにして、GPU はランドスケープの可視部分のみを描画し、ランドスケープ シェーダーでの負荷の少ない計算を行います。私の場合、オブジェクトを並べ替えて互いにより効果的に遮ることで、さらに 3 fps を得ることができました。
ただし、パフォーマンスの低下が非常に大きい場合は、シェーダーのコードを投稿できます。シェーダーのパフォーマンスを改善する方法もいくつかあるかもしれません。
カメラまでの距離に応じて風景を分割することをお勧めします。最も近いパーティションについては、ピクセルごとに描画し、さらにオブジェクトと詳細を追加することもできます. ファー パーティションには頂点ライティングを使用します。また、非常に遠いオブジェクトにはインポスターを使用してください。ランドスケープを分割するときは、近くのランドスケープのどのくらいの領域がスクリーン スペースに投影されるかをモデルに取り込む必要があります。ピクセル照明とレート低下の影響を受けます。