【问题标题】:Shader program to Vertex + Fragment shader着色器程序到顶点 + 片段着色器
【发布时间】:2013-05-03 07:56:19
【问题描述】:

我正在研究使用此着色器的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。它很接近,但它有一些有趣的额外内容,这些内容必须与它所针对的特定环境相关。
  • 它加载了glfx,我不想将它拖到我的代码中。必须有一种方法可以返回到有效且干净的 GLSL 代码。我只是不知道怎么做:(有什么帮助吗?

标签: opengl glsl shader fragment-shader vertex-shader


【解决方案1】:

这看起来像是一个使用 GLSL 代码并添加了一堆 Cg 语法的 CgFX 变体。要将其转换为有效的 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; 
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多