2011-12-16 6 views
1

私はdirectx9とopengl(2.1と均一バッファサポートなし)の両方で動かなければならないグラフィックスAPIに取り組んでいます シェイダーの2つのバージョンを書きたくないので、hlslとglsl(Cgはオプションではありません) ほとんどの問題を解決しました。シェーダのスクリプト部分(glslの頂点を作成して頂点の構造体をサポートするためのメインを作成する)にはluaを使用しましたが、定数を正しく取得するのは難しいです。どのようにしてglslのレジスタでシェーダ定数を設定できますか?

float4x4 WorldViewProjection : register(c0); 
float4 ColorTint   : register(c5); 
float3 UVOffset_Time  : register(c6); 

をしてから使用して、これらのすべてを設定します: HLSLで、私は書くことができますまた

SetVertexShaderConstantF(0, pData, 6) 

SetPixelShaderConstantFを。同じ設定を持つ構造体へ pDataをポイント(つまり、4×4のフロート行列、4フロートベクトル、3フロートベクトル)

私はGLSLで作ってみた唯一の解決策は次のとおりです。

uniform vec4 UNIFORM0[ 6 ]; 
#define WorldViewProjection mat4(UNIFORM0[0], UNIFORM0[1], UNIFORM0[2], UNIFORM0[3]) 
#define ColorTint UNIFORM0[4] 
#define UVOffset_Time vec3(UNIFORM0[5].xyz) 

、その後、私はOpenGLから "UNIFORM0"の位置を取得し、glUniform4fvARBを使って配列を設定します しかし、#defineを使って定数をシェーダに入れるのはかなり醜いです。

hlslと同様の方法で定数を設定する方法はありますか?どのような拡張機能が必要ですか?

は、私が実際すなわち、定義使用せずにソリューションを定義するに似て何かをするために、参照/ typedefは/ハンドルのいくつかの種類を使用することができます。

const mat4 WorldViewProjection = mat4(UNIFORM0[0], UNIFORM0[1], UNIFORM0[2], UNIFORM0[3]); 

答えて

2

を私はして定数を設定するための方法はありますhlslと同様の方法で、どの拡張機能が必要ですか?

いいえ。この概念はOpenGL(コアまたは拡張機能)には存在しませんし、今後もそうなることはありません。

HLSLスタイルよりも、GLSLスタイルのもの(均一な場所をシェーダに照会し、値を設定する場所を使用する方が簡単です)。結局のところ、HLSLスタイルでは、あなたは既に知っていることを照会するだけです。必要以上に多くのことをやっていますが、不要なクエリをAPIに追加する方が、クエリを必要とするクエリから削除するよりも簡単です。

+0

HLSLを使用すると、私はまったく問い合わせをしませんし、必要ないので、私はしたくないです。私はGLSLの問題を少しでも乗り越えることができます。これは、いくつかのset uniform float配列を照会するだけです。しかし、実際の定数を得るためにはdefineを使う必要はありません。 – Birken

+0

@Birken:GLSLにはクエリが必要です。また、クエリを必要とする2つのAPIがある場合、それらを抽象化する最も簡単な方法は、どちらのクエリも使用しないでクエリを実行しようとするのではなく、両方でクエリを実行することです。 –

+0

文字列を照会するだけでは十分ではありません。 apiは定数バッファーで動作します(dx11を使用する場合)。 必要以上にoglやdxコールをしたくないです。 – Birken

関連する問題