1

このシェーダーを使用するチュートリアルを勉強しています:

struct VSInput
{
  vec3 Position;
  vec2 TexCoord;
  vec3 Normal;  
};

interface VSOutput
{
  vec3 WorldPos;
  vec2 TexCoord;
  vec3 Normal;  
};


uniform mat4 gWVP;
uniform mat4 gWorld;

shader VSmain(in VSInput VSin:0, out VSOutput VSout)         
{                   
  gl_Position = gWVP * vec4(VSin.Position, 1.0);
  VSout.TexCoord   = VSin.TexCoord;                  
  VSout.Normal     = (gWorld * vec4(VSin.Normal, 0.0)).xyz;   
  VSout.WorldPos   = (gWorld * vec4(VSin.Position, 1.0)).xyz; 
};


struct FSOutput
{                   
  vec3 WorldPos;    
  vec3 Diffuse;     
  vec3 Normal;      
  vec3 TexCoord;    
};


uniform sampler2D gColorMap;                

shader FSmain(in VSOutput FSin, out FSOutput FSout)                                 
{                                           
FSout.WorldPos = FSin.WorldPos;                 
FSout.Diffuse  = texture(gColorMap, FSin.TexCoord).xyz; 
FSout.Normal   = normalize(FSin.Normal);                    
FSout.TexCoord = vec3(FSin.TexCoord, 0.0);              
};

program GeometryPass
{
  vs(410)=VSmain();
  fs(410)=FSmain();
};

これは遅延レンダリング用のジオメトリ パス シェーダーです。QT ベースのプログラムに移植しようとしていますが、私のコードでは頂点シェーダーとフラグメント シェーダーを別々にしかロードできません。

上記を2つのロード可能なシェーダーに分割する方法を誰かが提案できますか?

また、私が理解している限り、このシェーダーには OpenGL コア 4.1.0 が必要です。これは本当に必要ですか、それとも下位レベル (3.3 としましょう) を使用して同じ結果を達成する他の方法はありますか?

4

1 に答える 1

2

これは、一連の Cg 構文が追加された GLSL コードを使用する CgFX バリアントのように見えます。それを有効な GLSL に変換するには、それを個別の頂点シェーダーとフラグメント シェーダーに分割し、それぞれのエントリ ポイントの名前を に変更しmain、引数をエントリ ポイントに移動して、構造体ではなく複数のグローバル変数にする必要があります (衝突を避けるために名前を変更します)。 .) 最も微妙な詳細は、対応するグローバルの修飾子に:0なる VSmain 入力引数のセマンティックです。layoutin

したがって、頂点シェーダーは次のようになります。

#version 410 compatibility
//struct VSInput
//{
  in layout(location = 0) vec3 Position;
  in layout(location = 1) vec2 in_TexCoord;
  in layout(location = 2) vec3 in_Normal;  
//};

//interface VSOutput
//{
  out vec3 WorldPos;
  out vec2 TexCoord;
  out vec3 Normal;  
//};


uniform mat4 gWVP;
uniform mat4 gWorld;

//shader VSmain(in VSInput VSin:0, out VSOutput VSout)
main()     
{                   
  gl_Position = gWVP * vec4(Position, 1.0);
  TexCoord    = in_TexCoord;                  
  Normal      = (gWorld * vec4(in_Normal, 0.0)).xyz;   
  WorldPos    = (gWorld * vec4(Position, 1.0)).xyz; 
}

フラグメントシェーダーも同様に変換されます

于 2013-05-02T22:49:13.930 に答える