簡體   English   中英

將着色器程序轉換為Vertex + Fragment着色器

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM