[英]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.