Tôi đang tạo trò chơi khám phá không gian trong Unity và tôi đang gặp hai vấn đề với tính nửa trong suốt. Mỗi hành tinh được tạo thành từ hai mặt: Một là lớp bề mặt và đám mây kết hợp, mặt kia (với bán kính lớn hơn một chút) mô tả ánh sáng của đường chân trời bằng cách chọn mặt trước và mờ dần về phía mép ngoài của quả cầu. Điều này là tốt nhất làm việc tốt, nhưng với hai vấn đề sau đây:Dựng chính xác bán cầu trong suốt trong Unity5
1) Trong shader bề mặt tùy chỉnh của tôi, khi tôi sử dụng từ khóa alpha trong định nghĩa #pragma, alpha được tính vào quả cầu được hiển thị, nhưng 'ánh sáng' quả cầu biến mất ở khoảng cách vài nghìn đơn vị. Nếu tôi KHÔNG bao gồm từ khóa alpha, hình cầu không phai về phía cạnh, nhưng nó sẽ hiển thị ở khoảng cách.
2) Mặc dù thử tất cả các tùy chọn RenderType, Queue, ZWrite và ZDepth, hình cầu bề mặt và hình cầu 'phát sáng' là z-fighting; trò chơi dường như không thể quyết định đa giác nào gần hơn - mặc dù thực tế gần mặt trên quả cầu phát sáng nên được loại bỏ. Tôi thậm chí đã cố gắng đẩy quả cầu phát sáng ra khỏi máy ảnh của người chơi và mở rộng bán kính của nó bằng cùng một tỷ lệ, nhưng tôi là VẪN, không thể giải thích, nhận được cuộc chiến z giữa các lĩnh vực!
Có bất kỳ cài đặt nào mà tôi thiếu hay không sẽ cho phép hình cầu 'sáng' luôn được vẽ BEHIND bề mặt hình cầu (cho rằng tôi đã thử TẤT CẢ các kết hợp của ZWrite, ZDepth như được nêu chi tiết ở trên) và có cách nào không thế nào để có một đối tượng được kích hoạt alpha KHÔNG biến mất ở khoảng cách?
Tôi không thể hình dung điều này, vì vậy mọi trợ giúp sẽ được đánh giá cao!
EDIT
Đây là mã đổ bóng cho 'hình cầu phát sáng' của tôi. Mặt trước được chọn lọc. Tôi thậm chí đã thử từ khóa Offset để 'đẩy' bất kỳ đa giác được vẽ nào khác từ máy ảnh. Và tôi đã thử tất cả các tùy chọn Tag, ZWrite và ZTest mà tôi đã có thể tìm thấy. Đổ bóng được thông qua một màu sắc thái, một bầu không khí mật độ thả nổi và một véc tơ hướng mặt trời ...
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"
}
Bạn có sử dụng LOD không? Giống như LOD 250? Nếu có, hãy xóa nó. –
Không bao gồm LOD. Cảm ơn con trỏ mặc dù. – moosefetcher
Bạn có thể đưa mã của trình đổ bóng vào đây không? Tôi không thể nghĩ ra bất cứ điều gì có thể gây ra hiệu ứng này. Ngoài ra, ZTest Off là một tùy chọn hợp lệ, mặc dù không được liệt kê trong Hướng dẫn thống nhất chính thức. – HalpPlz