[英]Shader program to Vertex + Fragment shader
我正在研究使用此着色器的教程 :
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
着色器,并将进入入口的参数移至多个全局变量而不是结构中(避免重复命名)碰撞)的最细微的细节是。 :0
上VSmain输入参数,它变得语义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;
}
片段着色器也进行了类似的转换
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.