1

我正在学习使用此着色器的教程:

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)达到相同的结果?

4

1 回答 1

2

这看起来像是一个使用 GLSL 代码并添加了一堆 Cg 语法的 CgFX 变体。要将其转换为有效的 GLSL,您需要将其拆分为单独的顶点和片段着色器,重命名每个的入口点,并将入口点main的参数移动为多个全局变量而不是结构(重命名以避免冲突.) 最微妙的细节是:0VSmain 输入参数的语义,它成为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; 
}

片段着色器也进行了类似的转换

于 2013-05-02T22:49:13.930 回答