0
点赞
收藏
分享

微信扫一扫

学习100个Unity Shader (18) --- 几何着色器(Geometry Shader)

阿尚青子自由写作人 2024-05-28 阅读 7

文章目录

概述

  1. vertex shader --> [geometry shader] --> fragment shader。[]: 可选阶段。
  2. 输入图元 —> geometry shader —> 其他图元

编写格式

[maxcertexcount(N)]
void ShaderName (PrimitiveType InputVertexType InputName[NumElements], 
inout StreamOutputObjectVertexType) OutputName){// 几何着色器具体实现}

几何着色器每次输出的顶点个数都可能不同,[maxvertexcount(N)]用来指定几何着色器单次调用所输出的顶点数量最大值,输出点=1,输出线=2,输出三角形=3。
PrimitiveType图元类型:

图元类型
point输入图元拓扑类型为点列表
line输入图元拓扑类型为线列表或线条带
triangle输入的图元拓扑类型为三角形列表或三角形带
lineadj输入的图元拓扑类型为线条列表/带及其邻接图元
triangleadj输入的图元为三角形列表/带及其邻接图元

StreamOutputObjectVertexType 输出流类型

输出流类型
PointStream一系列顶点所定义的点列表
LineStream一系列顶点所定义的线条带
TriangleStream一系列顶点所定义的三角形带

举例

//The data structure from the application to the vertex shader.
struct a2v  
{  
    float4 vertex : POSITION;  
    float2 uv : TEXCOORD0;  
};  

//The data structure from the vertex shader to the geometry shader.
struct v2g  
{  
    float4 vertex : POSITION;  
    float2 uv : TEXCOORD0;  
};

//The data structure from the geometry shader to the fragment shader.
struct g2f
{  
    float4 vertex : SV_POSITION;  
    float2 uv : TEXCOORD0;
}; 
[maxvertexcount(3)]  
void geom(triangle v2g input[3], inout TriangleStream<g2f> outStream)  
{  
      g2f o;
      for(int i = 0; i < 3; i++)  
      {  
            o.vertex = UnityObjectToClipPos(input[i].vertex);  
            o.uv = input[i].uv;  
            outStream.Append(o);  //Append函数用来将几何着色器的输出数据追加到一个现有的流中。   
      }  
      outStream.RestartStrip();  //输出流是三角,重置输出流
}

应用举例(用预制体球的每个顶点画一个立方体)

在这里插入图片描述

参考

Unity几何着色器详解
GITHUB-GeometryShaderCookbook

举报

相关推荐

0 条评论