使用Unity HDRP高清渲染管线打造绚丽游戏画面(开始使用高清渲染管线)

游戏开发中,画面质量一直是一个重要的考虑因素。因为好的画面可以让游戏更加吸引人,增强玩家的代入感和游戏体验。为了实现更加绚丽的画面效果,Unity 推出了高清渲染管线(HDRP)。本文将详细介绍如何使用HDRP打造绚丽的游戏画面。

一、HDRP概述

Unity HDRP是Unity2018中新推出的通用渲染管线,主要用于制作高清实时渲染效果。它使用物理渲染模型,通过新的材质系统实现更高清、更真实的渲染效果。HDRP支持多种真实感预设和效果,例如光线追踪、全局反射、体积云、体积光、全局雾、景深等。

二、HDRP的材质系统

HDRP使用基于物理的渲染(PBR)模型,该模型通过实现材质着色器来计算表面外观。该表面外观取决于光照、视角和表面属性。PBR材质通常由四个输入组成:Albedo,Metallic,Smoothness和Normal Map。

下面是一个示例代码:

Shader "HDRP/Lit"
{
    Properties
    {
        _BaseMap ("Base Color", 2D) = "white" {}
        _Metallic ("Metallic", Range (0,1)) = 0.0
        _SmoothnessScale ("Smoothness", Range(0,1)) = 1.0
        _NormalMap ("Normal Map", 2D) = "bump" {}
        _NormalScale ("Normal Scale", Float) = 1.0
    }
    SubShader
    {
        Tags {"RenderType"="Opaque" "DisableBatching"="True"}
        LOD 100
 
        CGPROGRAM
 
        #pragma surface surf Standard
 
        #include "HDRP/ShaderPassLibrary.hlsl"
 
        struct Input
        {
            float2 uv_BaseMap;
            float2 uv_NormalMap; 
            float3 worldPos;
            float3 worldNormal;
            float3 worldTangent;
            float3 worldBitangent;
        };
 
        sampler2D _BaseMap;
        sampler2D _NormalMap;
        float _Metallic;
        float _SmoothnessScale;
        float _NormalScale;
 
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            o.Albedo = tex2D (_BaseMap, IN.uv_BaseMap).rgb;
            o.Metallic =
                _Metallic;
            o.Smoothness =
                tex2D (_BaseMap, IN.uv_BaseMap).a * _SmoothnessScale;
            o.Normal = UnpackNormal (
                tex2D (_NormalMap, IN.uv_NormalMap) * 2 - 1
                , IN.worldNormal
                , IN.worldTangent
                );

            o.Alpha =
                tex2D (_BaseMap, IN.uv_BaseMap).a;
        }
 
        ENDCG
    }
}

该代码中定义了一个基本的PBR表面着色器,并且通过属性_Albedo, _Metallic,_SmoothnessScale和_NormalMap控制其外观。可以看到Albedo对应颜色贴图,Metallic控制金属度,Smoothness是表面的粗糙度,而_NormalMap是法线贴图。

三、HDRP的全局体积效果

HDRP支持多种全局体积效果,可以用于更增强画面的真实感。

1. 体积雾

体积雾是一种效果,在将场景中的物体模糊处理之前渲染雾效果。它可以模拟雾、烟、蒸汽等自然现象。下面是一个基本的体积雾材质代码的示例:

Shader "HDRP/UnlitColor"
{
    Properties
    {
        _Color ("Base Color", Color) = (1,1,1,1)
        _VolumeFog (""SHADER_FEATURE_VOLUME_FOG"",Float) = 0
        _VolumeFogAlbedo("Volume Fog Albedo", 2D) = ""white"" {}
        _VolumeFogDistance ("Volume Fog Distance", Range(1,100)) = 50.0
        _VolumeFogBaseHeight ("Volume Fog Base Height", Range(0,10)) = 0.0
        _VolumeFogMeanFreePath ("Volume Fog Mean Free Path", Range(0.001,30.0)) = 1.0
        _VolumeFogMieG ("Volume Fog Mie G", Range(-0.999,0.999)) = 0.8
        _ZTest ("ZTest", Float) = LessEqual
    }
 
    SubShader
    {
        Tags { ""RenderType"" = ""Opaque"" }
        Pass
        {
            Name ""ColorPass""
            Tags { ""LightMode"" = ""Always"" }
            CGPROGRAM
            #pragma shader_feature_local _VolumeFog
 
            #include ""HDRP/Lighting"" 
            #include ""HDRP/VolumeFog.hlsl""
 
            #pragma surface surf Unlit
 
            sampler2D _VolumeFogAlbedo;
            float _VolumeFogDistance;
            float _VolumeFogBaseHeight;
            float _VolumeFogMeanFreePath;
            float _VolumeFogMieG;
            float4 _Color;
            float _ZTest;
 
            struct Input
            {
                float2 uv;
                float4 screenPos;
            };
 
            void surf (
                Input IN,
                inout SurfaceOutputUnlit o)
                {
                o.Albedo = _Color.rgb;
                o.Alpha = _Color.a;
            }
 
            ENDHDRP_BLOCKING_VOLUME_FOG_CBUFFER
            ENDHDRP_BLOCKING_VOLUME_FOG_TEXTURE_LOAD(_VolumeFogAlbedo)
            ENDHDRP_BLOCKING_VOLUME_FOG(_VolumeFogAlbedo, _VolumeFogDistance, _VolumeFogBaseHeight, _VolumeFogMeanFreePath, _VolumeFogMieG)
        }
    }
}

2. 体积云层

体积云层也是一种全局体积效果,因为它可以模拟云层和大气效果。下面是一个基本的体积云层材质代码的示例:

Shader "Custom/Clouds" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)
        _Thickness("Thickness", Range(0, 10)) = 1.0
        _AmbientLight("Ambient Light", Range(0, 1)) = 0.5
        _AlphaMultiplier("Alpha Multiplier", Range(0, 10)) = 1.0
    }
    
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 100
        CGPROGRAM
 
        #pragma surface surf Standard
        #include "HDRP/ShaderPassLibrary.hlsl"

        struct Input {
            float2 uv_MainTex;
            float3 worldPos;
            float3 worldNormal;
            float3 worldTangent;
            float3 worldBitangent;
        };
 
        sampler2D _MainTex;
        float4 _MainTex_ST;
        float4 _Color;
        float _Thickness;
        float _AmbientLight;
        float _AlphaMultiplier;
 
        void surf (Input IN, inout SurfaceOutputStandard o) {
            o.Albedo = _Color.rgb;
            o.Alpha = tex2D(_MainTex, IN.uv_MainTex).a * _AlphaMultiplier;
            o.Metallic = 0;
            o.Smoothness = 1 - saturate(_Thickness * dot(IN.worldNormal, _WorldSpaceCameraPos.xyz - IN.worldPos));
            o.Normal = UnpackNormal(texture2D(_MainTex, IN.uv_MainTex) * 2 - 1);
 
            o.Emission = float3(0.0, 0.0, 0.0);
        }

        ENDCG
    }
}

该代码中定义了一个体积云层表面着色器,并且通过属性_Thickness, _AmbientLight和_AlphaMultiplier控制其外观。可以看到Thickness对应云层的厚度,AmbientLight是环境亮度,而_AlphaMultiplier是透明度的乘数。

四、HDRP的光照系统

HDRP使用物理光照模型,可以创建多种不同的光源效果,例如点光源、聚光灯和方向光源。下面是代码示例:

Light sun = GameObject.Find("Sun").GetComponent();
sun.type = LightType.Directional;
sun.intensity = 10.0f;
sun.color = new Color(1.0f, 1.0f, 1.0f, 1.0f);
sun.shadows = LightShadows.Soft;
sun.shadowStrength = 0.8f;
sun.shadowBias = 0.05f;
sun.shadowNormalBias = 0.4f;

该代码创建一个方向光源,强度为10.0f,并使其产生阴影。

五、结语

在本文中,我们介绍了Unity HDRP高清渲染管线,并且提供了一个简单的代码示例,以展示如何使用HDRP打造绚丽游戏画面。同时,我们还讲述了HDRP的材质系统和全局体积效果,以及光照系统。现在您可以开始使用HDRP,为您的游戏添加更加逼真的画面效果!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平