2013-05-02 8 views
1

Я изучаю a tutorial, который использует этот шейдер:программа Shader для Vertex + пиксельного шейдера

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 core 4.1.0. Действительно ли это необходимо или есть какой-то другой способ добиться того же результата с использованием более низкого уровня (скажем, 3.3)?

+2

Это не является допустимым GLSL. Он близок, но у него есть некоторые смешные дополнительные вещи, которые должны быть связаны с конкретной средой, для которой она была написана. –

+0

Загружается с помощью [glfx] (https://code.google.com/p/glfx/), и я не хочу перетаскивать его в свой код. Должен быть способ вернуться к действительному и чистому GLSL-коду. Я просто не знаю, как :(Любая помощь? –

ответ

2

Это похоже на вариант CgFX с использованием кода GLSL с добавлением синтаксиса 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; 
} 

фрагмент шейдера аналогично преобразованной