【渲染流水线】[几何阶段]-[几何着色]以UnityURP为例
- 允许自定义增加和创建新图元,唯一一个能自定义增加新图元的着色器。(部分平台支持,移动端很多不支持、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为例的更多相关文章
- GPU渲染流水线的简单概括
GPU流水线 主要分为两个阶段:几何阶段和光栅化阶段 几何阶段 顶点着色器 --> 曲面细分着色器(可选)----->几何着色器(可选)----->裁剪-->屏幕 ...
- 《UnityShader入门精要》学习笔记之渲染流水线
第一种分类方式: 图形管道(如下7步): 顶点数据 : 由3D模型传递的三角形网格 顶点着色 : 编写CG程序对各个顶点进行着色 生成几何图元 : 连接特定的顶点生成几何图元,例如连接三个顶点生成一个 ...
- Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线
渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...
- Unity Shader 之 渲染流水线
Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...
- Unity Shader入门精要学习笔记 - 第2章 渲染流水线
来源作者:candycat http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...
- Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd
前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...
- 移动端 像素渲染流水线与GPU Hack
什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...
- OpenGL渲染流水线
其实OpenGL的流水线,对我学习来说只能算是一个概念性的东西.毕竟OpenGL也在发展,流水线也不会是一成不变的. 不过理解流水线的过程,重点在于理解每一步的作用,进而可以如何衔接起来,完成整个绘制 ...
- UML和模式应用4:初始阶段(4)--需求制品之用例模型模板示例
1. 前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: UP每个阶段包括 业务建模.需求.设计等科目: 其中需求科目对应的需求制品包括:设想.业务规则.用例模型.补充性规格说明.词 ...
随机推荐
- Filezilla提权漏洞复现
FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户 ...
- python的 range() 函数
python range() 函数可创建一个整数列表,一般用在 for 循环中. range(start, stop[step]) range(10) # 从 0 开始到 10 [0, 1, 2, 3 ...
- MySQL 主从延迟导致业务数据不一致
场景: 写入一条优惠劵数据,然后将该优惠劵信息读取出来同步给下游数据 现象: 本地写入优惠劵数据成功,同步信息成功.上周同步数据代码正常,周末改了发送优惠劵的信息,然后周一来了发现同步数据无法同步. ...
- Teradata在华落幕,国产化崛起,袋鼠云数栈会是更好的选择吗?
2月15日,数仓软件巨头Teradata宣布根据其对中国当前和未来商业环境的慎重评估,将逐步结束在中国的直接运营,后续进入中国公司的关闭程序. 一石激起千层浪,这一消息,在国内的To B市场引起了广泛 ...
- 第2周 神经网络基础题numpy运用
1.使用 Numpy 的 Python 基础知识 import math def basic_sigmoid(x): s = 1/(1+math.exp(-x)) #math.exp(x):为e的x次 ...
- Selenium Grid的原理,配置和WEB UI分布式测试
selenium grid 用于webui automation的分布式测试, 一般常规情况下,测试不建议用多线程,多线程会有很多问题,比如并发,锁机制等,什么时候线程该动什么时候停,考虑并发协同机 ...
- 2025 智能制造必看!国内五大 MES 系统排名深度解析
在 "中国制造 2025" 战略持续推进的背景下,制造企业数字化转型进入深水区.作为连接计划层与控制层的核心枢纽,MES(制造执行系统)已成为实现智能工厂的关键技术.2024 年国 ...
- 4G CAT1 DTU RS232/485转4G Modbus RTU转4G Modbus TCP RS232/485转MQTT DLT-645/RTU转云平台JSON
4G CAT1 DTU RS232/485转4G Modbus RTU转4G Modbus TCP RS232/485转MQTT DLT-645/RTU转云平台JSON 高性价比的CA ...
- Excel中的数字转文本和文本转数字
公式方法: 数字转文本: =TEXT(A1,"?") 文本转数字: 直接乘以1即可 数字转文本: =A1*1 或者使用value函数 =value() 分列方法: 在数据工具&qu ...
- MathQuill
前言 跟 MathJax.KaTex 不同,mathquill 是一个真正意义上的公式编辑器. 一边输入一边渲染,输出可以是 Tex,但是对于复杂的公式,这种输入方式还是有很大的局限性,输入过程还是需 ...