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