Sebuah render loop adalah istilah untuk semua operasi rendering yang terjadi dalam satu bingkai. Halaman ini berisi informasi untuk membuat loop render sederhana dalam render pipelineRangkaian operasi yang mengambil isi dari Adegan, dan menampilkannya di layar. Unity memungkinkan Anda memilih dari pipa render yang dibangun sebelumnya, atau menulis sendiri. More info
Lihat di Glossary kustom yang didasarkan pada Pipeline Render Berpikir Unity.
Contoh kode pada halaman ini menunjukkan prinsip-prinsip dasar menggunakan Render Pipeline Alkitab. Anda dapat menggunakan informasi ini untuk membangun Render Pipeline Alkitab kustom Anda sendiri, atau untuk memahami bagaimana kerja Pipeline Render Scriptable Unity.
Sebelum Anda mulai menulis kode untuk render loop Anda, Anda harus menyiapkan proyek Anda.
Langkah-langkahnya adalah sebagai berikut:
Dalam Render Pipeline Scriptable, Anda menggunakan tag LightMode
Pass untuk menentukan cara menggambar geometri. Untuk informasi lebih lanjut tentang Pass tag, lihat ShaderLab: menetapkan tag ke Pass.
Tugas ini menunjukkan kepada Anda bagaimana membuat Shader objectContoh kelas Shader, objek Shader adalah wadah untuk program naungan dan instruksi GPU, dan informasi yang memberi tahu Unity bagaimana menggunakannya. Gunakan mereka dengan bahan untuk menentukan penampilan adegan Anda. More info
Lihat di Glossary yang sangat sederhana dengan nilai tag LightMode Pass sebesar ExampleLightModeTag
.
// This defines a simple unlit Shader object that is compatible with a custom Scriptable Render Pipeline.
// It applies a hardcoded color, and demonstrates the use of the LightMode Pass tag.
// It is not compatible with SRP Batcher.
Shader "Examples/SimpleUnlitColor"
{
SubShader
{
Pass
{
// The value of the LightMode Pass tag must match the ShaderTagId in ScriptableRenderContext.DrawRenderers
Tags { "LightMode" = "ExampleLightModeTag"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
float4x4 unity_MatrixVP;
float4x4 unity_ObjectToWorld;
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
};
Varyings vert (Attributes IN)
{
Varyings OUT;
float4 worldPos = mul(unity_ObjectToWorld, IN.positionOS);
OUT.positionCS = mul(unity_MatrixVP, worldPos);
return OUT;
}
float4 frag (Varyings IN) : SV_TARGET
{
return float4(0.5,1,0.5,1);
}
ENDHLSL
}
}
}
Untuk menguji pekerjaan render loop Anda, Anda harus membuat sesuatu untuk membuat. Tugas ini menunjukkan cara menempatkan GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary dalam sceneAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary Anda yang menggunakan naungan yang kompatibel SRP yang Anda buat dalam tugas sebelumnya.
Tahap akhir persiapan adalah untuk membuat file sumber dasar yang diperlukan untuk SRP kustom Anda, dan beri tahu Unity untuk memulai rendering menggunakan SRP kustom.
RenderPipeline
dan Aset Pipa Render yang kompatibel, mengikuti instruksi di Membuat Render Pipeline Instance dan Render Pipeline Asset Dalam lingkaran render sederhana, operasi dasar adalah:
Jelas berarti menghapus hal-hal yang ditarik selama bingkai terakhir. Target render biasanya layar; Namun, Anda juga dapat membuat tekstur untuk menciptakan efek "gambar dalam gambar". Contoh-contoh ini menunjukkan cara render ke layar, yang merupakan perilaku default Unity.
Untuk menghapus target render di Pipa Render Scriptable, Anda melakukan hal berikut:
CommandBuffer
dengan perintah Clear
.CommandBuffer
ke antrian perintah pada ScriptableRenderContext
; untuk melakukan ini, hubungi ScriptableRenderContext.ExecuteCommandBuffer.ScriptableRenderContext
; untuk melakukan ini, memanggil ScriptableRenderContext.Submit.Seperti semua operasi Pipeline Render Scriptable, Anda menggunakan metode RenderPipeline.Render sebagai titik masuk untuk kode ini. Kode contoh ini menunjukkan cara melakukan ini:
/*
This is a simplified example of a custom Scriptable Render Pipeline.
It demonstrates how a basic render loop works.
It shows the clearest workflow, rather than the most efficient runtime performance.
*/
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipeline : RenderPipeline {
public ExampleRenderPipeline() {
}
protected override void Render (ScriptableRenderContext context, Camera[] cameras) {
// Create and schedule a command to clear the current render target
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// Instruct the graphics API to perform all scheduled commands
context.Submit();
}
}
Culling adalah proses penyaringan geometri yang tidak terlihat ke Kamera.
Untuk kusam di Pipa Render Scriptable, Anda melakukan berikut:
ScriptableCullingParameters
.CullingResults
.Kode contoh ini memperluas contoh di atas, dan menunjukkan cara menghapus target render dan kemudian melakukan operasi culling:
/*
This is a simplified example of a custom Scriptable Render Pipeline.
It demonstrates how a basic render loop works.
It shows the clearest workflow, rather than the most efficient runtime performance.
*/
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipeline : RenderPipeline {
public ExampleRenderPipeline() {
}
protected override void Render (ScriptableRenderContext context, Camera[] cameras) {
// Create and schedule a command to clear the current render target
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// Iterate over all Cameras
foreach (Camera camera in cameras)
{
// Get the culling parameters from the current Camera
camera.TryGetCullingParameters(out var cullingParameters);
// Use the culling parameters to perform a cull operation, and store the results
var cullingResults = context.Cull(ref cullingParameters);
}
// Instruct the graphics API to perform all scheduled commands
context.Submit();
}
}
Gambar adalah proses menginstruksikan API grafis untuk menarik set geometri yang diberikan dengan pengaturan yang diberikan.
Untuk menggambar di SRP, Anda melakukan berikut:
CullingResults
.Kode contoh ini membangun pada contoh di atas, dan menunjukkan cara menghapus target render, melakukan operasi budidaya, dan menggambar geometri yang dihasilkan:
/*
This is a simplified example of a custom Scriptable Render Pipeline.
It demonstrates how a basic render loop works.
It shows the clearest workflow, rather than the most efficient runtime performance.
*/
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipeline : RenderPipeline {
public ExampleRenderPipeline() {
}
protected override void Render (ScriptableRenderContext context, Camera[] cameras) {
// Create and schedule a command to clear the current render target
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// Iterate over all Cameras
foreach (Camera camera in cameras)
{
// Get the culling parameters from the current Camera
camera.TryGetCullingParameters(out var cullingParameters);
// Use the culling parameters to perform a cull operation, and store the results
var cullingResults = context.Cull(ref cullingParameters);
// Update the value of built-in shader variables, based on the current Camera
context.SetupCameraProperties(camera);
// Tell Unity which geometry to draw, based on its LightMode Pass tag value
ShaderTagId shaderTagId = new ShaderTagId("ExampleLightModeTag");
// Tell Unity how to sort the geometry, based on the current Camera
var sortingSettings = new SortingSettings(camera);
// Create a DrawingSettings struct that describes which geometry to draw and how to draw it
DrawingSettings drawingSettings = new DrawingSettings(shaderTagId, sortingSettings);
// Tell Unity how to filter the culling results, to further specify which geometry to draw
// Use FilteringSettings.defaultValue to specify no filtering
FilteringSettings filteringSettings = FilteringSettings.defaultValue;
// Schedule a command to draw the geometry, based on the settings you have defined
context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);
// Schedule a command to draw the Skybox if required
if (camera.clearFlags == CameraClearFlags.Skybox && RenderSettings.skybox != null)
{
context.DrawSkybox(camera);
}
// Instruct the graphics API to perform all scheduled commands
context.Submit();
}
}
}