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

前情提要

【渲染流水线】主线索引-从数据到图像以UnityURP为例-CSDN博客

  • 图元装配负责将离散顶点组装成完整几何图元(如点、线、三角形、三角形条带)

对渲染的探索是个持续不断完善的过程,记录这个过程将零散的内容整理起来,其中肯定会有理解偏差和问题,如果哪里有问题,欢迎在评论区探讨和指出)

输入数据

接收‌顶点着色器输出的离散顶点数据‌,包括:

  • 变换后的空间坐标(如裁剪空间位置)
  • 顶点属性(颜色、法线、纹理坐标等

输出数据

生成‌完整几何图元‌(Primitive),例如:

  • 三角形(GL_TRIANGLES
  • 线段(GL_LINES
  • 点(GL_POINTS)‌

在Unity中,图元装配的实现

主要通过‌**网格拓扑(Mesh Topology)‌和‌索引缓冲区(Index Buffer)**‌完成。

顶点分组模式‌

  1. 索引分组模式‌通过索引数组(如Mesh.trianglesMesh.GetIndices())定义顶点连接顺序,每个索引指向顶点缓冲区中的位置,按预设拓扑规则分组‌。例如:

    text
    索引数组 [0,1,2,3,4,5]
    三角形拓扑 → 分组为△(0,1,2)和△(3,4,5)
    
  2. 顺序分组模式‌无索引时直接按顶点提交顺序分组(如连续3顶点构成一个三角形)‌。


‌Unity支持的图元类型‌

图元类型描述
三角形(Triangles每3个独立顶点构成一个三角形,默认用于3D模型渲染‌。
三角形条带(TriangleStrip复用前2顶点与当前顶点生成新三角形,减少顶点重复提交‌。
四边形(Quads每4顶点构成一个四边形(实际渲染时拆分为2个三角形)。
线段(Lines每2顶点构成一条线段,用于线框渲染‌。
点(Points每个顶点独立渲染为屏幕上的点‌。

‌拓扑连接规则‌

  1. 缠绕顺序(Winding Order)‌Unity默认使用‌顺时针顺序‌判定三角形正面,逆时针面会被剔除‌。例如:
    • 顶点顺序(v1,v2,v3)为顺时针 → 可见
    • 顺序(v1,v3,v2)为逆时针 → 剔除‌。
  2. 共享顶点优化‌索引数组可复用顶点(如[0,1,2,1,2,3]生成两个共享边(1,2)的三角形)。

‌关键实现接口‌

  1. 设置拓扑类型‌通过MeshTopology枚举指定图元类型(如MeshTopology.Triangles)‌。
  2. 索引缓冲区操作
    • Mesh.SetIndices():自定义索引分组规则
    • Mesh.triangles:直接设置三角形索引(旧API,效率较低)‌

URP中对图元装配的调用位置与示例

在Unity URP (Universal Render Pipeline) 中,几何阶段的图元装配是由底层渲染管线自动处理的,主要通过ScriptableRenderContextCommandBuffer系统完成。

‌核心类与调用流程‌

  • UniversalRenderPipeline.RenderSingleCamera‌入口点,通过ScriptableRenderContext提交绘制命令
  • ScriptableRenderContext.DrawRenderers‌触发几何处理,最终调用底层图形API (如OpenGL/D3D)
  • CommandBuffer.DrawProcedural‌直接控制图元装配(手动模式)

图元装配示例代码‌

以下是不同图元类型的装配方式示例:

三角形 (Triangles)‌

csharp
// 通过MeshFilter自动装配var meshFilter = GetComponent<MeshFilter>();
Graphics.DrawMesh(meshFilter.sharedMesh, transform.position, transform.rotation, material, 0);

三角形带 (Triangle Strip)‌

csharp
// 手动通过CommandBuffer装配
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(Matrix4x4.identity,material,0,MeshTopology.TriangleStrip,vertexCount: 4// 需要至少4个顶点形成2个三角形
);
context.ExecuteCommandBuffer(cmd);

四边形 (Quads)‌

csharp
// URP中四边形会被拆分为三角形处理
Mesh quadMesh = new Mesh();
quadMesh.vertices = new Vector3[] {/* 4个顶点 */ };
quadMesh.SetIndices(new int[] {0,1,2, 0,2,3}, MeshTopology.Triangles, 0);
Graphics.DrawMesh(quadMesh, Matrix4x4.identity, material, 0);

线段 (Lines)‌

csharp
// 使用GL.LINES或LineRenderer组件
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(Matrix4x4.identity,lineMaterial,0,MeshTopology.Lines,vertexCount: 2
);

点 (Points)‌

csharp
// 使用MeshTopology.Points
CommandBuffer cmd = new CommandBuffer();
cmd.DrawProcedural(Matrix4x4.identity,pointMaterial,0,MeshTopology.Points,vertexCount: 1
);

底层实现位置‌

  • URP源码关键文件‌:UniversalRenderPipelineCore.cs → ExecuteRenderPass方法ScriptableRenderer.cs → EnqueuePass提交绘制命令
  • Shader支持‌:在Shader中需声明正确的#pragma target和几何着色器(如需要)

调试

  1. 使用Frame Debugger查看实际提交的图元类型
  2. 在URP设置中启用Native Rendering Debugger
  3. 检查材质的Render QueueShader Pass设置

更深入的管线定制,可继承ScriptableRendererFeature实现自定义几何处理。

接下来:【渲染流水线】[几何阶段]-[归一化NDC]以UnityURP为例-CSDN博客


【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93087.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93087.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93087.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm有哪些垃圾回收器,实际中如何选择?

7.G1收集器一款面向服务端应用的垃圾收集器。 特点如下&#xff1a; 并行与并发&#xff1a;G1能充分利用多CPU、多核环境下的硬 件优势&#xff0c;使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作&#xff0c;G1收 集器仍然可以通过并…

多语言与隐形攻击:LLM安全防线为何被频频突破?

你是否曾以为&#xff0c;只要加装了“防火墙”&#xff0c;大型语言模型&#xff08;LLM&#xff09;就能高枕无忧&#xff1f;Trendoyl 的实际测试却让我大吃一惊&#xff1a;即便部署了 Meta 的 Llama Guard&#xff0c;攻击者还是能轻松用多语种、字符混淆&#xff0c;甚至…

分布式光伏气象站:为光伏电站的 “气象感知眼”

分布式光伏气象站&#xff1a;为光伏电站的 “气象感知眼”柏峰 【BF-GFQX】在全球能源转型的浪潮中&#xff0c;分布式光伏发电凭借其就近消纳、清洁高效的优势&#xff0c;成为能源结构优化的重要力量。而分布式光伏气象站&#xff0c;作为光伏电站的 “智慧感知眼”&#xf…

TCP与UDP:如何选择最佳传输协议

应用场景选择如果需要可靠传输&#xff0c;首选 TCP如果需要传输的数据包很大&#xff0c;也首选 TCP绝大部分的场景&#xff0c;都可以优先考虑 TCPUDP 相比于 TCP&#xff0c;最大的优点在于传输效率有些情况&#xff0c;既需要可靠性又需要性能&#xff0c;这个时候时候就需…

《Leetcode》-面试题-hot100-栈

题目列表 20. 有效的括号 简单难度 leetcode链接 155. 最小栈 中等难度 leetcode链接 394. 字符串解码 中等难度 leetcode链接 739. 每日温度 中等难度 leetcode链接 84. 柱状图中最大的矩形 困难难度 leetcode链接 题目 &#xff08;1&#xff09;有效的括号 题目 给…

GPT-5、Claude-4 同台亮相!OneEval发布全新“大模型+知识库”评测白皮书!

OneEval官网地址&#xff1a;http://OneEval.OpenKG.cnOneEval文章链接&#xff1a;https://arxiv.org/abs/2506.12577要点导读 今年4月&#xff0c;OpenKG发布“大模型知识库”融合能力评估榜单OneEval v1.0。近期&#xff0c;OpenKG在此基础上&#xff0c;组织撰写了OneEv…

【最新版】沃德云商协系统全开源+uniapp小程序

一.介绍沃德云商协是一款基于FastAdmin&#xff08;thinkphp&#xff09;Uniapp开发的“多组织”的云服务平台&#xff0c;打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台&#xff0c;让各大分会、各大分校友会、分组织实现轻松管理&#xff0c;线上宣传展示…

Wireshark专家模式定位网络故障:14种TCP异常深度解剖

TCP连接如同精密运转的传送带&#xff0c;每一个异常数据包都是故障的早期信号。作为网络工程师的“外科手术刀”&#xff0c;Wireshark在TCP故障诊断领域的价值无可替代。本文将通过14个真实故障场景&#xff0c;揭示如何利用Wireshark专家系统&#xff08;Expert System&…

Python Day28 HTML 与 CSS 核心知识点 及例题分析

一、HTML 布局标签&#xff08;含 H5 语义化标签&#xff09;传统布局多使用div标签&#xff0c;H5 新增语义化标签增强可读性&#xff1a;核心知识点header&#xff1a;替代div#header&#xff0c;用于页面头部&#xff08;如标题、导航&#xff09;。footer&#xff1a;替代d…

MySQL 数据库表操作与查询实战案例

MySQL 数据库表操作与查询实战案例 在数据库学习过程中&#xff0c;熟练掌握表的创建、数据插入及各类查询操作是基础且重要的技能。本文将通过实际案例&#xff0c;详细介绍 MySQL 中数据库表的设计、数据插入以及常用的查询操作&#xff0c;帮助初学者快速上手。 项目一&…

THCV215一种高速视频数据收发器,采用低电压差分信号(LVDS)技术支持高速串行数据传输,支持1080p/60Hz高分辨率传输

THCV215 是一款符合 V-by-One HS 标准的 高速视频数据收发器。THCV215和THCV216被设计为支持主机和显示器之间的视频数据传输。该芯片组可以在20MHz至100MHz的LVDS时钟频率下&#xff0c;仅通过一根差分电缆传输39bit视频数据和3bit同步数据。该芯片组有两个高速数据通道&#…

Linux 系统下 VS Code 降级至 1.85 版本教程:通过历史版本网站解决兼容性问题

一、问题背景 当前使用的 VS Code 版本为 1.102.3&#xff0c;这一版本可能是未来版本、内部测试版或 Insiders 版本&#xff0c;而目前最新的稳定版属于 1.8x 系列。由于版本过新&#xff0c;可能导致与部分插件&#xff08;如旧版 Remote-SSH&#xff09;或系统环境不兼容。…

一个基于 PyTorch 的完整模型训练流程

一个基于 PyTorch 的完整模型训练流程 flyfish训练步骤具体操作目的1. 训练前准备设置随机种子、配置超参数&#xff08;batch size、学习率等&#xff09;、选择计算设备&#xff08;CPU/GPU&#xff09;确保实验可复现&#xff1b;统一控制训练关键参数&#xff1b;利用硬件加…

ffmpeg,ffplay, vlc,rtsp-simple-server,推拉流命令使用方法,及测试(二)

一、常用命令 ffmpeg 推流命令 : ffmpeg -re -i input.mp4 -c copy -f flv rtmp://39.105.129.233/myapp/ffmpeg -re -i input.mp4 -c copy -f flv rtsp://39.105.129.233/myapp/-re 读取流 -i 输入文件 -f # 指定推流formatffplay 拉流命令 : ffplay rtmp://39.105.129.233/m…

使用行为树控制机器人(三) ——通用端口

文章目录一、通用端口功能实现1. 功能实现1.1 头文件定义1.2 源文件实现1.3 main文件实现1.4 tree.xml 实现2. 执行结果使用行为树控制机器人(一) —— 节点使用行为树控制机器人(二) —— 黑板使用行为树控制机器人(三) —— 通用端口有了上述前两节我们已经可以实现节点间的通…

DataDome反爬虫验证技术深度解析:无感、滑块与设备验证全攻略

DataDome反爬虫验证技术深度解析&#xff1a;无感、滑块与设备验证全攻略 随着网络安全威胁的不断演进&#xff0c;企业对数据保护的需求日益增强。DataDome作为业界领先的反爬虫解决方案&#xff0c;以其三层防护机制在众多知名网站中得到广泛应用。本文将深入解析DataDome的…

RabbitMQ 消息转换器详解

RabbitMQ 消息转换器详解 一、为什么需要消息转换器&#xff1f; RabbitMQ 的消息传输协议只识别字节流&#xff1a; 发送对象时&#xff0c;需要序列化成字节数组接收消息时&#xff0c;需要将字节数组反序列化成对象 如果不使用消息转换器&#xff1a; 需要手动序列化和反序列…

内网穿透的应用-告别“现场救火”!用 cpolar远程调试让内网故障排查进入“云时代”

文章目录前言**常见困境与解决方案****实际应用价值**1. Remote JVM Debug2. 系统要求与环境准备2.1 服务器环境2.2 本地开发环境3. 内网服务器准备及开始3.1 安装cpolar配置支持远程ssh登录3.1.1 什么是cpolar&#xff1f;3.1.2 安装cpolar3.1.3 注册及配置cpolar系统服务3.1.…

Cherryusb UAC例程对接STM32内置ADC和PWM播放音乐和录音(下)=>UAC+STM32 ADC+PWM实现录音和播放

1. 程序基本框架整个程序框架, 与之前的一篇文章《Cherryusb UAC例程对接STM32内置ADC和DAC播放音乐和录音(中)>UACSTM32 ADCDAC实现录音和播放》基本一致, 只是这次将DAC替换成了PWM。因此这里不再赘述了。 2. audio_v1_mic_speaker_multichan_template.c的修改说明(略) 参…

1 JQ6500语音播报模块详解(STM32)

系列文章目录 文章目录系列文章目录前言1 JQ6500简介2 基本参数说明2.1 硬件参数2.2 模块管脚说明3 控制方式3.1 通信格式3.2 通信指令4 硬件设计5 软件设计5.1 main.c5.2 board_config5.2.1board_config.h5.2.2 board_config.c5.3 module_config5.3.1 module_config.h5.3.2 mo…