在游戏开发中,画面质量一直是一个重要的考虑因素。因为好的画面可以让游戏更加吸引人,增强玩家的代入感和游戏体验。为了实现更加绚丽的画面效果,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,为您的游戏添加更加逼真的画面效果!