2016-02-05 17 views
12

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" 
} 
+0

Bạn có sử dụng LOD không? Giống như LOD 250? Nếu có, hãy xóa nó. –

+0

Không bao gồm LOD. Cảm ơn con trỏ mặc dù. – moosefetcher

+0

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

Trả lời

0

tôi dường như đã stumbled khi một giải pháp cho vấn đề này trong khi cố gắng giải quyết thế giới không gian 'jittering' .. Trò chơi tôi đang phát triển sử dụng khoảng cách lớn. Tôi đã thay đổi cách đối tượng đường dài được định vị (khoảng cách nhận được hợp đồng xa hơn một đối tượng là từ máy ảnh) và điều đó đã giải quyết z-fighting và alpha biến mất. Một hệ thống năng lượng mặt trời hoàn toàn phù hợp với 300000 kilômet bằng cách sử dụng căn bậc hai của khoảng cách chia cho khoảng cách và nhân tương đối với Vector3 và tỷ lệ của đối tượng theo đó. Hy vọng rằng thông tin có thể hữu ích cho ai đó.

0

Nếu bạn đang sử dụng alpha thì bạn cần thay đổi Thẻ để hiển thị alpha trong đường viền trong suốt. Cũng tắt ZWrite. Và loại bỏ các Offset.

Tôi đã thử nghiệm trình đổ bóng của bạn trong một dự án trống với cả hiển thị Chuyển tiếp và Hoãn. Nó hoạt động tốt với những điều chỉnh này.

Tất cả các hình mờ đục được vẽ đầu tiên, sau đó vượt qua alpha được thực hiện và hiển thị tất cả các đối tượng có độ trong suốt trên TOP của tất cả các đối tượng trong cảnh. Nó cần phải làm điều này nếu không nó sẽ không thể pha trộn các màu sắc cho alpha.

Tags { "RenderType" = "Transparent" "Queue" = "Transparent" } 
ZWrite Off 
0

Bạn đã nghĩ về việc hiển thị các đối tượng lớn ở một quy mô khác trong máy ảnh khác để tạo skybox động? Điều đó chắc chắn sẽ giải quyết vấn đề chiến đấu z. Bạn có thể có, ví dụ: hai máy ảnh - một máy ảnh hiển thị các đối tượng trong phạm vi 0,1-1000 và một máy ảnh khác, dao động từ 1000 đến 100000.

Tối ưu hóa bổ sung có thể bao gồm môi trường hiển thị từ xa đến hộp bầu trời khối lập phương và thực hiện điều đó không phải mọi khung hình (ngoại trừ những dịp đặc biệt khi bạn tiêu diệt một hành tinh từ xa).

Ngoài ra còn có một mối quan tâm tối ưu khác - bạn có thể hiển thị một vòng phẳng quanh hành tinh, xoay sang mặt máy ảnh, để tránh bị lấn át trên bề mặt hành tinh thực tế. Nhưng điều đó sẽ đòi hỏi tính toán ánh sáng phức tạp hơn, rõ ràng.

Ngoài ra, bạn đã thử trình đổ bóng trong suốt của mình trên máy ảnh không có Skybox làm cờ rõ ràng chưa? Kiểm tra this answer về cách sử dụng skybox tùy chỉnh.

+0

Chào mừng bạn đến với StackOverflow! Lần tới, hãy thử đăng một số mã mẫu làm câu trả lời của bạn vì liên kết có thể trở thành không hợp lệ – cdomination

+0

Mã hộp đêm không liên quan đến câu trả lời này. – mcfrei

Các vấn đề liên quan