着色器程序到节点+片段着色器

问题描述:

我学习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

这看起来像一个使用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; 
} 

片段着色器同样转化