public void Render( ScriptableRenderContext context, Camera camera, bool useDynamicBatching, bool useGPUInstancing ) { // 设置相机矩阵 context.SetupCameraProperties(camera); // 清除渲染目标 var cmd = new CommandBuffer {
可以看出URP与Unity引擎进行通信依靠的就是这个ScriptableRenderContext,而URP继承自RenderPipeline,RenderPipeline使用这些Script ableRenderContext类型的对象作为参数调用上图这些一系列的函数向引擎发起通信,目的就是告诉引擎:我现在要(开始/结束)渲染了,我渲染的过程是怎样的(ScriptableRenderContext类的参数) 二、Render()...
ScriptableRenderContext context, Camera camera, bool useDynamicBatching, bool useGPUInstancing ) { // 设置相机矩阵 context.SetupCameraProperties(camera); // 清除渲染目标 var cmd = new CommandBuffer { name = camera.name }; cmd.ClearRenderTarget(true, true, Color.clear); context.ExecuteCommandBuff...
(注:因为RenderNodeQueue是由IndexList生成的,所以RenderNode对应的Renderer是场景中可见的) 二. Scriptable Draw 现在,我们知道了动态物体Culling的结果就是RenderNodeQueue。Unity接下来就要进行绘制了,先介绍一些绘制过程中的函数。 CommandBuffer.Blit(); CommandBuffer.DrawMesh(); ScriptableRenderContext.DrawRenderers()...
第一个参数是ScriptableRenderContext,这个参数本身定义了 URP 中需要的管线状态和绘制指令,具体来说,它可以做几件事情: 第一个是去负责 CameraCulling,你把每个 Camera Culling 的传到你的这个 ScriptableRenderContext 当中,用这个东西 culling 出来的东西,Unity 帮你 culling 出来 camera 所能看到的这些绘制对象。
定义自定义 RenderPipeline 时,可使用 ScriptableRenderContext 向 GPU 调度和提交状态更新和绘制命令。RenderPipeline.Render 方法实现通常会针对每个摄像机剔除渲染管线不需要渲染的对象(请参阅 CullingResults),然后对 ScriptableRenderContext.DrawRenderers 发起一系列调用并混合 ScriptableRenderContext.ExecuteCommandBuffer ...
ScriptableRenderContext.BeginScopedRenderPass publicRendering.ScopedRenderPassBeginScopedRenderPass(intwidth, intheight, intsamples, NativeArray<AttachmentDescriptor>attachments, intdepthAttachmentIndex); 参数 width渲染通道表面的宽度(以像素为单位)。 height渲染通道表面的高度(以像素为单位)。
继续往下查找,这些实例初始化的地方都在Execute(ScriptableRenderContext context,refRenderingData renderingData)函数里面: 而最终实现后处理渲染的地方是在voidRender(CommandBuffer cmd,refRenderingData renderingData)函数中: SetupBloom方式则是具体的实现逻辑,有兴趣的可以自己独自去探究了,本文就不在深入介绍了。
创建CameraRenderer在Render函数里绘制Skybox 代码如下所示,很简单: publicclassCameraRenderer{ ScriptableRenderContext context; Camera camera;// 由RenderPipeline的Render函数每帧调用此函数publicvoidRender(ScriptableRenderContext context, Camera camera){this.context = context;this.camera = camera; ...
然后把它在Frame Debugger里显示出来,感觉有点类似Unity的Profiler.BeginSample操作,代码如下,我感觉其实就是创建了一个函数指针的数组,然后把这些数组Copy到Context的Command Buffer里: public class CameraRenderer { ScriptableRenderContext context; Camera camera; const string bufferName = "Render Camera"; Command...