1

いくつかのユニフォームを含む OpenGL ES シェーダーがあります。フラグメント シェーダーでユニフォームの計算を行います。シェーダー コンパイラは通常、ユニフォーム上でこれらの式を最適化し、すべてのピクセルではなく 1 回発生するようにしますか? それとも、シェーダーの外部で計算を行い、結果を渡す必要がありますか?

具体的には、シェーダーに渡す 3 つの均一な座標があります。

uniform vec2 u_a;
uniform vec2 u_b;
uniform vec2 u_c;

そして、それらの点の間でいくつかのベクトルを計算します。

vec2 v0 = u_c - u_a;
vec2 v1 = u_b - u_a;

シェーダー コンパイラがレンダリングごとに 1 回発生するようにこれらを最適化できるかどうか、またはシェーダーの外部でこれらを計算して追加のユニフォームとして渡す必要があるかどうかに興味があります。もちろん、最適化のために、特定の状況での違いを見つけるために実際に測定する必要があります (GPU は CPU よりもすべてのピクセルでこれを行う方が速い可能性があるため) が、シェーダー コンパイラがどの程度のスコープを持っているかに興味があります。一般的にこのような最適化。

Android/iPhone デバイスのシェーダー コンパイラが異なる動作をする可能性があることを知っている場合、または異なる GLSL バージョンが違いを生む場合はボーナス ポイントです。

4

1 に答える 1

1

コンパイラはそれを最適化できますか? はい、可能です。しますか?オブジェクトのレンダリングを開始するときにかなりのオーバーヘッドが必要になるため、おそらくそうではありません (シェーダーの事前計算可能なすべてのものを事前計算する必要があります)。

于 2013-03-28T23:50:13.133 に答える