Пример шейдера отражений во встроенном Render Pipeline
Когда Skybox используется в сцене как источник отражения (см. Освещение окна), то по сути дела " по умолчанию " Зонд отражения Создается файл, содержащий данные Skybox. Зонд отражения является внутренней частью Кубическая карта текстура; мы расширим вышеуказанный шейдер норм мирового пространства, чтобы посмотреть на это.
Код начинает немного задействоваться к этому времени. Конечно, если вы хотите, чтобы шейдеры автоматически работали с освещением, тенью, отражениями и остальной частью системы освещения, это намного проще использовать поверхностные шейдеры. Этот пример предназначен для того, чтобы показать вам, как использовать части системы освещения в «ручном» режиме.
Shader "Unlit/SkyReflection"
{
SubShader
{
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
half3 worldRefl : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
{
v2f o;
o.pos = UnityObjectToClipPos(vertex);
// compute world space position of the vertex
float3 worldPos = mul(_Object2World, vertex).xyz;
// compute world space view direction
float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
// world space normal
float3 worldNormal = UnityObjectToWorldNormal(normal);
// world space reflection vector
o.worldRefl = reflect(-worldViewDir, worldNormal);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the default reflection cubemap, using the reflection vector
half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.worldRefl);
// decode cubemap data into actual color
half3 skyColor = DecodeHDR (skyData, unity_SpecCube0_HDR);
// output it!
fixed4 c = 0;
c.rgb = skyColor;
return c;
}
ENDHLSL
}
}
}
Приведенный выше пример использует несколько вещей из встроенного шейдера , включая файлы:
- unity_SpecCube0, unity_SpecCube0_HDR, Object2World, UNITY_MATRIX_MVP из встроенных переменных шейдера. unity_SpecCube0 содержат данные для активного зонда отражения.
- UNITY_SAMPLE_TEXCUBE является макросом встроенным в для выборки кубического отображения. Большинство обычных кубических отображений декларируются и используются с помощью стандартного синтаксиса HLSL (samplerCUBE и texCUBE), однако кубические отображения зонда отражения в Unity декларируются особым способом для экономии на слотах выборки. Если вы не знаете, что это такое, не волнуйтесь, просто знайте, что для использования unity_SpecCube0 кубического отображения вам нужно использовать макрос UNITY_SAMPLE_TEXCUBE.
- UnityWorldSpaceViewDir функция из UnityCG.cginc, и DecodeHDR функция из того же файла. Последний используется для получения фактического цвета из данных отражательного зонда – так как Unity хранит кубическую карту отражательного зонда в специально кодированном виде.
- reflect — это просто встроенная функция HLSL для вычисления векторного отражения вокруг заданной нормы.