2016-03-23 21 views
0

私はGLSLフラグメントシェーダに次のコードがある場合:それはコンパイラは、これらの三角関数を評価する代わりに、彼らはすべてのフラグメントの実行中に評価されていることを正気仮定GLSL:コンパイラは定数引数を持つ関数を評価しますか?

float r = 0.386; 
float a = 26.6; 
float xd = r*cos(0.0174532924*(a+0)); 
float yd = r*sin(0.0174532924*(a+0)); 
float xe = r*cos(0.0174532924*(a+90)); 
float ye = r*sin(0.0174532924*(a+90)); 

ですが?

+0

など、シェーダモデルをフォン用のシーンライトを渡して、オブジェクト全体の値、IEアルファ値に使用されている最適化レベルとコンパイラに依存しますが、アセンブリを見てみました? – Vladp

+1

一度だけ計算する必要がある場合は、計算してユニフォーム変数またはUBOに送信してください。 – WearyWanderer

+0

私は実際には計算機で計算し、xd、yd、xe、yeの値を直接取り出すことができますが、私がコンパイラに頼ることができるのであれば、自己文書化の目的でこの状態にしておきたいと思います。 – user1282931

答えて

0

この場合、悲しいことに、GPUによってコンパイルが行われるため、あまり分かりません。コンパイラの中には最適化されているものもあるので、実装に依存していると思います。

しかし、WearyWandererが言っているように、値をハードコードしたり、ユニフォーム/ UBOで渡すことができます。

0

あなたが言及したように、値を計算して直接割り当てることができますが、ドキュメンテーションの目的で使用したい場合は、シェーダコードを実行するたびに値が同じであると仮定します。

ユニフォーム変数は、ある時点でユニフォーム変数を変更しない限り、1回計算してシェーダーに送信し、実行ごとに同じ変数です。たとえば、次のように

float r = 0.386; 
    float a = 26.6; 

    float xd_val = r*cos(0.0174532924*(a+0)); 
    GLuint xd_id = glGetUniformLocation(pShaderProgram, "xd"); 
    glUniform1f(xd_id, xd_val); 

これは、均一な変数としてシェーダプログラムに渡して、シェーダがそれをrecaulcatingせずに、すべての実行のための値へのアクセスを持っていますが、まだ葉、CPUの上に一度だけ値を算出し、必要なドキュメントをここに記述してください。

制服のは、一般的に

関連する問題