2013-05-02 418 views
1

我學習a tutorial使用這種着色器:着色器程序到節點+片段着色器

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)?

+2

無效GLSL。這很接近,但它有一些有趣的額外的東西,必須與它所寫的特定環境相關。 – 2013-05-02 21:17:00

+0

它裝有[glfx](https://code.google.com/p/glfx/),我不想將它拖入我的代碼中。必須有一種方法才能回到有效且乾淨的GLSL代碼。我只是不知道如何:(任何幫助? – 2013-05-02 21:20:24

回答

2

這看起來像一個使用GLSL代碼的CgFX變體,添加了一堆Cg語法。要將其轉換爲有效的GLSL,需要將其分割爲單獨的頂點和片段着色器,將每個入口點重命名爲main,並將參數移至入口點,以使其成爲多個全局變量而不是結構體(重命名要避免的結構碰撞)。最微妙的細節是VSmain輸入參數上的:0語義,它在相應的in全局變量上變爲layout限定符。

因此,頂點着色器變爲:

#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; 
} 

片段着色器同樣轉化