着色器程序到节点+片段着色器
问题描述:
我学习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)?
答
这看起来像一个使用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;
}
片段着色器同样转化
无效GLSL。这很接近,但它有一些有趣的额外的东西,必须与它所写的特定环境相关。 – 2013-05-02 21:17:00
它装有[glfx](https://code.google.com/p/glfx/),我不想将它拖入我的代码中。必须有一种方法才能回到有效且干净的GLSL代码。我只是不知道如何:(任何帮助? – 2013-05-02 21:20:24