2016-03-30 17 views
0

最近私はMonogameを使ってアプリケーションを開発し始め、シェーダとシェーディング言語の世界に入りました。ターゲットプラットフォームはGLです。これは、シェイダーをHLSLに書く必要があることを意味します.HLSLはその後、MojoShaderによってGLSLに変換されます。MojoShader:HLSLからGLSLへの変換

私はいつも非常に明白な何かを見逃しています。誰かが私を助けてくれるのだろうかと思っていました。シーン内のすべてのオブジェクトを均一な暗灰色で塗りつぶすことになっているコードを次に示します。

float4x4 World; 
float4x4 View; 
float4x4 Projection; 

float4 AmbientColor = float4(1, 1, 1, 1); 
float AmbientIntensity = 0.1; 

struct VertexShaderInput 
{ 
    float4 Position : POSITION0; 
}; 

struct VertexShaderOutput 
{ 
    float4 Position : POSITION0; 
}; 

VertexShaderOutput VertexShaderFunction(VertexShaderInput input) 
{ 
    VertexShaderOutput output; 

    float4 worldPosition = mul(input.Position, World); 
    float4 viewPosition = mul(worldPosition, View); 
    output.Position = mul(viewPosition, Projection); 

    return output; 
} 

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 
{ 
    return AmbientColor * AmbientIntensity; 
} 

technique Ambient 
{ 
    pass Pass1 
    { 
     VertexShader = compile vs_2_0 VertexShaderFunction(); 
     PixelShader = compile ps_2_0 PixelShaderFunction(); 
    } 
} 

残念ながら、私には空白の画面が表示されます。しかし、ここでは、ピクセルシェーダのコードの1行をreturn AmbientColor * AmbientIntensity;と変更してreturn float4(1,1,1,1) * float(1);とすると、正しい結果が得られ、実際に画面上のオブジェクトを見ることができます。あたかもゼロに設定されているグローバル変数を使用しているかのようです。

HLSLからGLSLに変換する際に問題が発生する可能性がありますか。HLSLコードを書く際に特定の点を覚えておく必要がありますか?

この質問に答えるのを手伝ったり、正しい方向に向けるのを助けてくれたら大変感謝します。ありがとうございました。

答えて

0

DirectXのFXシステムでは、均一変数AmbientColorAmbientIntensityを値で初期化できますが、GLSLではこれを許可していません。その点では、どちらもHLSLはありません.HLSLの上に構築されたFXシステムだけです。

これらのユニフォームは、デフォルトでゼロ(または、おそらく他の初期化されていない値)になります。

GLSLシェーダを使用する前に、プログラムコードで一様な定数を設定する必要があります。 OpenGLでは、これは通常glUniform1fglUniform4fを呼び出すことによって行われます。

+0

タイムリーな応答ありがとうございます。それは少し物事をクリアします。 – MutomboDikey

関連する問題