2016-02-05 9 views
12

में अर्द्ध पारदर्शी क्षेत्र को सही ढंग से प्रस्तुत करना मैं एकता में एक अंतरिक्ष अन्वेषण खेल बना रहा हूं और मुझे अर्द्ध पारदर्शिता के साथ दो समस्याएं हैं।यूनिटी 5

प्रत्येक ग्रह दो गोलाकारों से बना होता है: एक संयुक्त सतह और बादल परत है, दूसरा (थोड़ा बड़ा त्रिज्या वाला) क्षैतिज 'चमक' को सामने के चेहरों को खींचकर और अल्फा को बाहरी किनारे की तरफ घुमाकर दिखाता है क्षेत्र। यह सबसे अच्छा काम कर रहा है, लेकिन निम्नलिखित दो समस्याओं के साथ:

1) मेरे कस्टम सतह शेडर में, जब मैं #pragma परिभाषा में अल्फा कीवर्ड का उपयोग करता हूं, अल्फा को प्रस्तुत क्षेत्र में फ़ैक्टर किया जाता है, लेकिन 'चमक' क्षेत्र कुछ हज़ार इकाइयों की दूरी पर गायब हो जाता है। यदि मैं अल्फा कीवर्ड शामिल नहीं करता हूं, तो क्षेत्र किनारे की ओर फीका नहीं है, लेकिन यह दूरी पर प्रस्तुत करता है।

2) सभी रेंडरटाइप, क्यूई, जेड्राइट और जेडप्थ विकल्पों को आजमाने के बावजूद, सतह क्षेत्र और 'चमक' क्षेत्र z-fight हैं; गेम यह तय नहीं कर सकता कि कौन से बहुभुज निकट हैं - चमक के क्षेत्र में चेहरों के नजदीक तथ्य को कम किया जाना चाहिए। मैंने प्लेयर कैमरे से चमकदार क्षेत्र को दूर करने और उसी अनुपात से अपने त्रिज्या का विस्तार करने की भी कोशिश की है, लेकिन मैं अभी भी, गोलाकारों के बीच ज़ेड-फाइटिंग प्राप्त कर रहा हूं!

क्या कोई ऐसी सेटिंग है जो मुझे याद आ रही है जो 'चमक' क्षेत्र को सतह के क्षेत्र के पीछे हमेशा खींचा जा सकेगा (बशर्ते मैंने ऊपर वर्णित ZWrite, ZDepth के सभी संयोजनों को आजमाया है) और क्या कोई तरीका है अल्फा-सक्षम ऑब्जेक्ट रखने के लिए दूरी पर गायब नहीं है?

मुझे यह पता लगाना प्रतीत नहीं होता है, इसलिए किसी भी मदद की सराहना की जाएगी!

संपादित
यहाँ मेरी 'चमक क्षेत्र' के लिए शेडर कोड है। सामने के चेहरे को खींचा जाता है। मैंने ऑफ़सेट कीवर्ड को कैमरे से आगे खींचे गए बहुभुजों को 'धक्का' देने का भी प्रयास किया है। और मैंने उन सभी टैग, जेड्राइट और जेडटेस्ट विकल्पों को आजमाया है जिन्हें मैं ढूंढने में सक्षम हूं। शेडर एक टिंट रंग, माहौल घनत्व नाव और सूरज दिशा वेक्टर ...

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

क्या आप एलओडी का उपयोग करते हैं? एलओडी 250 की तरह? यदि हां इसे हटा दें। –

+0

कोई एलओडी शामिल नहीं है। यद्यपि सूचक के लिए धन्यवाद। – moosefetcher

+0

क्या आप यहां अपने शेडर्स कोड शामिल कर सकते हैं? मैं इस प्रभाव के कारण कुछ भी नहीं सोच सकता। इसके अलावा, आधिकारिक एकता मैनुअल में सूचीबद्ध नहीं होने के बावजूद, ZTest Off एक मान्य विकल्प है। – HalpPlz

उत्तर

0

मैं विश्व अंतरिक्ष 'jittering' को हल करने का प्रयास करते हुए इस समस्या का समाधान पर ठोकर खाई गए हैं लगता है पारित हो .. जो खेल मैं विकसित कर रहा हूं वह बड़ी दूरी का उपयोग करता है। मैंने लंबी दूरी की वस्तुओं को स्थानांतरित करने के तरीके को बदल दिया है (दूरी को अनुबंधित किया जाता है और एक वस्तु कैमरे से होती है) और जिसने ज़ेड-लड़ाकू और अल्फा गायब हो गया है। एक संपूर्ण सौर प्रणाली दूरी से विभाजित दूरी के वर्ग रूट का उपयोग करके 300,000 किलोमीटर की तरह कुछ फिट बैठती है और इसके द्वारा संबंधित वेक्टर 3 और वस्तु के पैमाने को गुणा कर देती है। उम्मीद है कि जानकारी किसी के लिए उपयोगी हो सकती है।

0

यदि आप अल्फा का उपयोग कर रहे हैं तो आपको पारदर्शिता पास में अल्फा प्रस्तुत करने के लिए टैग को बदलने की आवश्यकता है। ZWrite भी बंद करें। और ऑफ़सेट हटा दें।

मैंने आपके शेडर को एक खाली प्रोजेक्ट में फॉरवर्ड और डिफरर्ड रेंडरिंग के साथ परीक्षण किया। यह इन समायोजनों के साथ ठीक काम किया।

सभी अपारदर्शी ज्यामिति पहले खींचे जाते हैं, तो अल्फा पास किया जाता है और दृश्य में सभी ऑब्जेक्ट्स के शीर्ष पर पारदर्शिता के साथ सभी वस्तुओं को प्रस्तुत करता है। इसे ऐसा करने की ज़रूरत है अन्यथा यह अल्फा के लिए रंगों को मिश्रण करने में सक्षम नहीं होगा।

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

आप एक और कैमरे में एक अलग पैमाने में बड़ी वस्तुओं प्रतिपादन गतिशील skybox बनाने के लिए के बारे में सोचा है? यह निश्चित रूप से ज़ेड-लड़ाकू मुद्दों को हल करेगा। उदाहरण के लिए, आपके पास दो कैमरे हो सकते हैं - एक जो ऑब्जेक्ट्स को 0.1-1000 रेंज में प्रस्तुत करता है, और अन्य, जो 1000 से 100000 तक है।

अतिरिक्त अनुकूलन में दूर से घन आकाशबॉक्स तक प्रतिपादन वातावरण शामिल हो सकता है और ऐसा करना हर फ्रेम नहीं (शायद विशेष अवसरों को छोड़कर जब आप दूर से ग्रह को नष्ट करते हैं)।

एक और अनुकूलन चिंता भी है - वास्तविक ग्रह की सतह पर ओवरड्रा से बचने के लिए, आप कैमरे के सामने घुमाए गए ग्रह के चारों ओर एक सपाट अंगूठी प्रस्तुत कर सकते हैं। लेकिन जाहिर है, इसके लिए अधिक जटिल प्रकाश गणना की आवश्यकता होगी।

इसके अलावा, क्या आपने कैमरे पर अपने पारदर्शी शेडर की कोशिश की है जिसमें स्काईबॉक्स स्पष्ट झंडे के रूप में नहीं है? कस्टम स्काईबॉक्स का उपयोग करने के तरीके पर this answer देखें।

+0

स्टैक ओवरव्लो में आपका स्वागत है! अगली बार, कुछ नमूना कोड को अपने उत्तर के रूप में पोस्ट करने का प्रयास करें क्योंकि लिंक अमान्य हो सकते हैं – cdomination

+0

स्काईबॉक्स कोड इस उत्तर के लिए प्रासंगिक नहीं है। – mcfrei

संबंधित मुद्दे