Я делаю космическую разведку в Unity, и у меня две проблемы с полупрозрачностью.
Каждая планета состоит из двух сфер: одна представляет собой объединенный поверхностный и облачный слой, другой (с чуть большим радиусом) изображает "свечение" горизонта, отбраковывая передние грани и затухающую альфу по направлению к внешнему краю сферы, Это МОЩНО работает нормально, но со следующими двумя проблемами:
1) В моем настраиваемом шейдере поверхности, когда я использую альфа-ключевое слово в определении #pragma, альфа учитывается в визуализированной сфере, но сфера "свечения" исчезает на расстоянии нескольких тысяч единиц. Если я НЕ включаю альфа-ключевое слово, сфера не будет исчезать к краю, но она отображается на расстоянии.
2) Несмотря на то, что все параметры RenderType, Queue, ZWrite и ZDepth, сферическая сфера и "свечение" сфера - z-борьба; игра, похоже, не может решить, какие полигоны находятся ближе - несмотря на то, что грани поверхности на сфере свечения должны быть отбракованы. Я даже попытался оттолкнуть сферу свечения от камеры плеера и расширить его радиус на ту же пропорцию, но я ВСЕГО, необъяснимо, получаю z-сражение между сферами!
Есть ли какие-либо настройки, которые мне не хватает, что позволит шару "свечение" всегда рисовать в области поверхности (учитывая, что я пробовал ВСЕ комбинации ZWrite, ZDepth, как описано выше), и есть ли способ иметь объект с альфа-поддержкой НЕ исчезает на расстоянии?
Я не могу понять это, поэтому любая помощь будет хорошо оценена!
ИЗМЕНИТЬ
Вот шейдерный код для моей "сферы свечения". Передние поверхности отбракованы. Я даже пробовал ключевое слово Offset, чтобы "нажимать" любые вытянутые полигоны дальше от камеры. И я пробовал все параметры Tag, ZWrite и ZTest, которые мне удалось найти. Шейдер получает оттенок Color, плавучесть плотности атмосферы и вектор направления солнца...
Shader "Custom/planet glow" {
Properties {
_glowTint ("Glow Tint", Color) = (0.5,0.8,1,1)
_atmosphereMix ("Atmosphere Mix", float) = 0
_sunDirection ("Sun Direction", Vector) = (0, 0, 0, 0)
}
SubShader {
Tags { "RenderType" = "Opaque" "Queue" = "Geometry" }
Cull Front // I want only the far faces to render (behind the actual planet surface)
Offset 10000, 10000
ZWrite On // Off also tried
ZTest LEqual // I have tried various other options here, incombination with changing this setting in the planet surface shader
CGPROGRAM
#pragma surface surf Lambert alpha
#pragma target 4.0
struct Input {
float3 viewDir;
};
fixed4 _glowTint;
float _atmosphereMix;
float4 _sunDirection;
void surf (Input IN, inout SurfaceOutput o) {
_sunDirection = normalize(_sunDirection);
o.Albedo = _glowTint;
float cameraNormalDP = saturate(dot( normalize(IN.viewDir), -o.Normal ) * 4.5);
float sunNormalDP = saturate(dot( normalize(-_sunDirection), -o.Normal ) * 2);
o.Alpha = _atmosphereMix * sunNormalDP * (cameraNormalDP * cameraNormalDP * cameraNormalDP); // makes the edge fade 'faster'
o.Emission = _glowTint;
}
ENDCG
}
FallBack "Diffuse"
}