Membuat Render Pipeline Asset dan Render Pipeline Instance dalam pipa render kustom
Kamera

Membuat loop render sederhana dalam pipa render kustom

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.

Mempersiapkan proyek Anda

Sebelum Anda mulai menulis kode untuk render loop Anda, Anda harus menyiapkan proyek Anda.

Langkah-langkahnya adalah sebagai berikut:

  1. Buat naungan yang kompatibel SRP.
  2. Buat satu atau lebih GameObjects untuk membuat.
  3. Buat struktur dasar SRP kustom Anda.
  4. Sitemap Jika Anda berencana untuk memperluas SRP kustom sederhana Anda untuk menambahkan fungsi yang lebih kompleks, instal paket SRP Core. Paket inti SRP termasuk perpustakaan SRP Core Opsional: (yang dapat Anda gunakan untuk membuat warna Anda SRP Batcher kompatibel), dan fungsi utilitas untuk operasi umum. Untuk informasi lebih lanjut, lihat .shaderProgram yang berjalan di GPU. More info
    Lihat di Glossary
    library (which you can use to make your shaders SRP Batcher compatible), and utility functions for common operations. For more information, see the .

Membuat naungan yang kompatibel SRP

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.

  1. Buat aset naungan baru di proyek Anda. Untuk instruksi untuk membuat aset naungan, lihat Shader assets.
  2. Dalam tampilan Proyek Anda, klik ganda aset naungan untuk membuka kode sumber naungan dalam editor teks.
  3. Ganti kode yang ada dengan berikut:
// 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
        }
    }
}

Membuat GameObject untuk membuat

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.

  1. Buat aset material baru di proyek Unity Anda. Untuk instruksi lihat MaterialsAset yang menentukan bagaimana permukaan harus diberikan. More info
    Lihat di Glossary
    .
  2. Menetapkan aset naungan ke aset material. Untuk instruksi, lihat Materials.
  3. Buat kubus di tempat kejadian Anda. Untuk instruksi, lihat Objektif.
  4. Masukkan materi ke dalamnya. Untuk instruksi, lihat Materials.

Membuat struktur dasar SRP kustom Anda

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.

  1. Buat kelas yang berwarisi dari RenderPipeline dan Aset Pipa Render yang kompatibel, mengikuti instruksi di Membuat Render Pipeline Instance dan Render Pipeline Asset
  2. Mengatur Aset Pipeline Render aktif, mengikuti instruksi di Bagaimana cara mendapatkan, mengatur, dan mengkonfigurasi pipa render aktif. Unity akan mulai rendering menggunakan SRP kustom segera, yang berarti bahwa pandangan Scene viewTampilan interaktif ke dunia yang Anda buat. Anda menggunakan Adegan Lihat untuk memilih dan posisi pemandangan, karakter, kamera, lampu, dan semua jenis lain dari Game Object. More info
    Lihat di Glossary
    dan Game Anda akan kosong sampai Anda menambahkan kode ke SRP kustom Anda.

Membuat render loop

Dalam lingkaran render sederhana, operasi dasar adalah:

  • Menjelaskan target render, yang berarti menghapus geometri yang ditarik selama bingkai terakhir.
  • Culling, yang berarti menyaring geometri yang tidak terlihat menjadi CameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
    Lihat di Glossary
    .
  • Drawing, yang berarti memberitahu GPU apa geometri untuk menggambar, dan bagaimana menggambarnya.

Menjelaskan target render

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:

  1. Konfigurasikan perintah CommandBuffer dengan perintah Clear.
  2. Tambahkan CommandBuffer ke antrian perintah pada ScriptableRenderContext; untuk melakukan ini, hubungi ScriptableRenderContext.ExecuteCommandBuffer.
  3. Membangun API grafis untuk melakukan antrian perintah pada 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

Culling adalah proses penyaringan geometri yang tidak terlihat ke Kamera.

Untuk kusam di Pipa Render Scriptable, Anda melakukan berikut:

  1. Populasi struct ScriptableCullingParameter dengan data tentang Kamera; untuk melakukan ini, hubungi Kamera.TryGetCullingParameter.
  2. Opsional: Secara manual memperbarui nilai-nilai bangunan ScriptableCullingParameters.
  3. Hubungi ScriptableRenderContext.Cull, dan simpan hasilnya dalam bangunan 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();
    }
}

Drawing

Gambar adalah proses menginstruksikan API grafis untuk menarik set geometri yang diberikan dengan pengaturan yang diberikan.

Untuk menggambar di SRP, Anda melakukan berikut:

  1. Lakukan operasi budidaya, seperti yang dijelaskan di atas, dan menyimpan hasilnya dalam struktur CullingResults.
  2. Buat dan mengkonfigurasi struct FilteringSettings, yang menjelaskan cara menyaring hasil culling.
  3. Buat dan mengkonfigurasi struct DrawingSettings, yang menggambarkan geometri mana untuk menggambar dan cara menggambarnya.
  4. Optional: Secara default, Unity menetapkan state render berdasarkan objek Shader. Jika Anda ingin menimpa state render untuk beberapa atau semua geometri yang Anda cari, Anda dapat menggunakan struct RenderStateBlock untuk melakukan ini.
  5. Memanggil ScriptableRenderContext.DrawRenderers, dan lewatkan struktur yang Anda buat sebagai parameter. Unity menarik set geometri yang disaring, sesuai dengan pengaturan.

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();
        }
    }
}
Membuat Render Pipeline Asset dan Render Pipeline Instance dalam pipa render kustom
Kamera