我正在研究使用此着色器的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)?
答案 0 :(得分:2)
这看起来像是使用GLSL代码的CgFX变体,并添加了一堆Cg语法。要将其转换为有效的GLSL,您需要将其拆分为单独的顶点和片段着色器,将每个的入口点重命名为main
,并将参数移动到入口点,使其成为多个全局变量而不是结构(重命名事物以避免冲突。)最细微的细节是VSmain输入参数上的:0
语义,它在相应的layout
全局变量上成为in
限定符。
所以顶点着色器变为:
#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;
}
片段着色器被类似地转换