• 允许自定义增加和创建新图元,唯一一个能自定义增加新图元的着色器。(部分平台支持,移动端很多不支持、apple的metal不支持)

【从UnityURP开始探索游戏渲染】专栏-直达

作用

  • 基于图元生成新几何体(如将点扩展为粒子),位于曲面细分后、光栅化前 ‌。
  • 这是一个‌可选‌阶段。它在曲面细分着色器之后运行(或在顶点着色器之后,如果没有曲面细分)。它接收一个完整的图元(点、线或三角形,以及其所有顶点),可以输出零个、一个或多个修改过的或全新的图元(点、线、三角带)。‌

配置

  • Shader 中声明 #pragma geometry geom

核心工作原理

  • 数据处理流程:

    • 输入阶段:接收完整图元数据(点/线/三角形及其邻接变体)的顶点数组
    • 处理阶段:通过流输出对象动态修改几何数据,支持顶点增删改操作
    • 输出阶段:使用Append()方法将新顶点写入流对象,RestartStrip()重置三角带
  • 图元操作机制:
    • 增删控制:通过maxvertexcount限制单次调用最大输出顶点数(建议值3-20个)
    • 修改方式:在齐次裁剪空间重新计算顶点位置
    • 分裂实现:例如将三角形拆分为多个子三角形时需重新计算法线

URP实现步骤

  • Shader基础结构:

    hlsl
    Shader "Custom/URPGeoShader" {
    Properties { _Extrude("Extrude", Float) = 0.1 }
    SubShader {
    Pass {
    HLSLPROGRAM
    #pragma vertex vert
    #pragma geometry geom
    #pragma fragment frag
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct v2g {
    float4 posOS : TEXCOORD0;
    float3 normalOS : NORMAL;
    }; struct g2f {
    float4 posCS : SV_POSITION;
    float3 normalWS : TEXCOORD0;
    }; [maxvertexcount(6)]
    void geom(triangle v2g input[3], inout TriangleStream<g2f> stream) {
    // 几何处理逻辑
    }
    ENDHLSL
    }
    }
    }
  • 关键参数说明:

    • PrimitiveType:支持point/line/triangle及其邻接类型
    • Stream类型:PointStream/LineStream/TriangleStream三种输出流
    • 性能优化:建议输出标量总数控制在20个以内

典型应用案例

模型细分:

hlsl
void geom(triangle v2g input[3], inout TriangleStream<g2f> stream) {
float3 center = (input[0].posOS + input[1].posOS + input[2].posOS) / 3;
for(int i=0; i<3; i++) {
g2f o;
o.posCS = UnityObjectToClipPos(center);
stream.Append(o);
o.posCS = UnityObjectToClipPos(input[i].posOS);
stream.Append(o);
o.posCS = UnityObjectToClipPos(input[(i+1)%3].posOS);
stream.Append(o);
stream.RestartStrip();
}
}

轮廓线生成:

hlsl
[maxvertexcount(6)]
void geom(triangle v2g input[3], inout TriangleStream<g2f> stream) {
// 原始三角形
for(int i=0; i<3; i++) {
g2f o;
o.posCS = UnityObjectToClipPos(input[i].posOS);
stream.Append(o);
}
stream.RestartStrip(); // 外扩轮廓
float extrude = _Extrude;
for(int i=0; i<3; i++) {
g2f o;
float4 offset = float4(input[i].normalOS * extrude, 0);
o.posCS = UnityObjectToClipPos(input[i].posOS + offset);
stream.Append(o);
}
}

注意事项:

  • 平台兼容性:需DX11/OpenGL ES3.2以上API支持
  • 移动端限制:部分低端设备可能不支持几何着色器
  • 性能影响:建议在PC平台使用,移动端需严格测试

【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)

【渲染流水线】[几何阶段]-[几何着色]以UnityURP为例的更多相关文章

  1. GPU渲染流水线的简单概括

    GPU流水线 主要分为两个阶段:几何阶段和光栅化阶段   几何阶段      顶点着色器 --> 曲面细分着色器(可选)----->几何着色器(可选)----->裁剪-->屏幕 ...

  2. 《UnityShader入门精要》学习笔记之渲染流水线

    第一种分类方式: 图形管道(如下7步): 顶点数据 : 由3D模型传递的三角形网格 顶点着色 : 编写CG程序对各个顶点进行着色 生成几何图元 : 连接特定的顶点生成几何图元,例如连接三个顶点生成一个 ...

  3. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  4. Unity Shader 之 渲染流水线

    Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...

  5. Unity Shader入门精要学习笔记 - 第2章 渲染流水线

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  7. Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd

    前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...

  8. 移动端 像素渲染流水线与GPU Hack

    什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...

  9. OpenGL渲染流水线

    其实OpenGL的流水线,对我学习来说只能算是一个概念性的东西.毕竟OpenGL也在发展,流水线也不会是一成不变的. 不过理解流水线的过程,重点在于理解每一步的作用,进而可以如何衔接起来,完成整个绘制 ...

  10. UML和模式应用4:初始阶段(4)--需求制品之用例模型模板示例

    1. 前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: UP每个阶段包括 业务建模.需求.设计等科目: 其中需求科目对应的需求制品包括:设想.业务规则.用例模型.补充性规格说明.词 ...

随机推荐

  1. 【对称加密】DES与AES算法详解及Java实现

    对称加密:DES与AES算法详解及Java实现 目录 对称加密概述 DES算法详解 AES算法详解 Java实现示例 安全注意事项 总结 1. 对称加密概述 对称加密是指加密和解密使用相同密钥的加密算 ...

  2. Windows安装MySQL常见错误

    错误1:提示缺少Visual Studio 2019 x64 Redistributable 现象: 在windows系统上使用Mysql8以上的msi进行安装时,可能提示缺少Visual Studi ...

  3. CentOS7 vsftpd服务搭建与详解

    FTP介绍 文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件.上传文件.下载文件. FTP 基于TCP协议生成一个虚拟的连接,主要用 ...

  4. 2024杭电钉耙1-1003 HDOJ7435 树

    本文同步发布于我的网站 Problem 给一棵根为 1 的有根树,点 \(i\) 具有一个权值 \(A_i\) . 定义一个点对的值 \(f(u, v)=\max \left(A_u, A_v\rig ...

  5. stm32cubemx+freertos+中断实现IIC从机

    最近做一个项目需要将stm32配置为iic的从机模式来响应总线的读写需求,看了网上的大部分资料讲解的都不是很全面,因此这里做一个小分享. iic通信流程 要编写iic从机模式的代码,就得对iic得整个 ...

  6. php链式调用

    我们经常在项目中会写到 Mode::find()->where()->orderBy()->limit(); 链式调用,那么它是怎么实现的呢? 昨天看韩天峰大佬的视频,学到了 关键点 ...

  7. [abc309 F] Box in Box

    F - Box in Box 首先,每个长方体的\(h,w,d\)都是可以任意互换的,所以我们考虑用\(a_0,a_1,a_2\)来代替它们(\(a_0\leq a_1\leq a_2\)) 然后可以 ...

  8. [Ynoi2016] 炸脖龙 I

    题目传送门 已经能过 hack,原因:做快速幂的时候需要微判一下边界.很好奇 lxl 为什么不卡 显然区间加可用线段树做. 然后操作二用扩展欧拉定理,每个 \(p\) 最多递归 \(\log\) 层, ...

  9. C#/.NET/.NET Core技术前沿周刊 | 第 45 期(2025年7.1-7.6)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  10. .NET 9 + React 开发的企业级后台权限管理系统,文档齐全,轻松上手

    前言 在数字化转型浪潮中,高效且安全的权限管理是后台系统的核心基石.传统方案或依赖臃肿的三方框架,或难以满足细粒度权限需求. 今天推荐一款完全独立开发.基于前沿技术栈开发的RBAC权限系统.它摒弃了现 ...