ฉันจะเขียน shader ที่สว่างขึ้นเมื่อวัตถุอยู่ใกล้พื้นผิวได้อย่างไร


15

ในวิดีโอOverplay gameplayตัวป้องกันของตัวละครจะสว่างเป็นสีขาวในบริเวณที่อยู่ใกล้กับรูปทรงเรขาคณิตของวัตถุอื่น

โล่ของ Reinhart ตัดรูปทรงเรขาคณิตบางระดับ

สังเกตว่าขอบสีขาวบนแผ่นป้องกันสีน้ำเงินอยู่ใกล้กับพื้นกำแพงและเสา

ฉันเชื่อว่าตัวป้องกันมีรูปแบบของตัวเองและเอฟเฟกต์นั้นทำได้ด้วย shader แต่ฉันก็ไม่ได้ลองคิดวิธีแปลแนวคิดของ "ความใกล้ชิด" เป็นโปรแกรม shader


2
หากคุณกำลังใช้ความสามัคคีการพูดคุยนี้อาจเป็นที่สนใจ ตรวจสอบส่วนที่ "Intersection Highlights" เริ่มต้นที่สไลด์ 26
DMGregory

ดังนั้นคำตอบจึงได้รับการกล่าวถึงด้านล่าง แต่นี่คือวิดีโออธิบายว่า: youtube.com/watch?v=C6lGEgcHbWc
CobaltHex

คำตอบ:


28

เค้าโครงทั่วไป:

  1. สร้างแผนที่เชิงลึกของฉากของคุณโดยไม่มีเกราะป้องกัน คุณสามารถรับสิ่งนี้ได้อย่างมีประสิทธิภาพโดยไม่เสียค่าใช้จ่ายเนื่องจากวัตถุโปร่งใสมักจะแสดงผลในเวลาต่อมา มิฉะนั้นคุณสามารถสร้างแผนที่ความลึกได้โดยการสร้างฉากซานซันโล่ลงบนRTTด้วยเครื่องปรับความลึก

  2. แสดงภาพของคุณตามปกติส่งแผนที่ความลึกไปที่โล่ของคุณ

  3. ใน shader ให้คำนวณความแตกต่างของความลึกของฉากจากความลึกของชิ้นส่วนของโล่และใช้ความแตกต่างนั้นเพื่อปรับเปลี่ยนสีของชิ้นส่วน

การสาธิต

ฉันเขียนตัวอย่าง WebGL อย่างง่ายของสิ่งนั้น

สกรีนช็อตของการสาธิต

ทีละบรรทัด

มาดูรายละเอียดของ shader code ในรายละเอียด:

float solidsDepth = texture2D(depthMap, gl_FragCoord.xy / dims).r;

ตัวอย่างแผนที่ความลึกในทุกส่วน อย่าลืมแบ่งตามขนาดวิวพอร์ตของคุณเพื่อแปลงแฟรกเมนต์ของคุณจากพื้นที่หน้าจอ [0, ความกว้าง / ความสูง] ไปเป็นพิกัด [0.0, 1.0] ณ จุดนี้ถ้าคุณเพียงแค่ตั้งค่าสีของชิ้นส่วนเป็นพิกเซลแผนที่ความลึกตัวอย่างมันจะมีลักษณะดังนี้:

สกรีนช็อตของแผนที่ความลึก

แผนที่เชิงลึกคือระดับสีเทาดังนั้นคุณสามารถรับค่าจากช่องใด ๆ (ฉันใช้rที่นี่)

float solidsDiff = 1.0 - smoothstep(
    zNear,
    zFar,
    gl_FragCoord.z / gl_FragCoord.w
  ) - solidsDepth;

จากนั้นคุณสามารถใช้ตัวอย่างความลึกนั้นเพื่อค้นหาความแตกต่างระหว่างความลึกของฉากและความลึกของส่วนของโล่ โปรดจำไว้ว่าให้ปรับความลึกของคุณให้เป็นมาตรฐานด้วยการนำจาก [zNear, zFar] (เครื่องบินใกล้และไกลที่สุดในกล้องของคุณ) ไปที่ [0.0, 1.0] smoothstepทำอย่างนี้ 1.0 -คือการกลับค่าดังกล่าวว่าsolidsDiffเป็น 1.0 เมื่อความแตกต่างคือสูงสุด (zFar - zNear) และ 0.0 ที่ต่ำสุด (0.0)

โปรดทราบว่าฉันได้สันนิษฐานsolidsDepthแล้วว่าได้รับการทำให้เป็นมาตรฐานในส่วนลึกที่สร้างแผนที่ความลึก

float alpha = 0.3 + max(0.0, 1.0 - log(100.0 * (solidsDiff - 0.005) + 1.0));

จากนั้นคุณสามารถปรับเปลี่ยนช่องอัลฟาของโล่ของคุณขึ้นอยู่กับความแตกต่างของความลึก ที่นี่เราเริ่มต้นที่อัลฟาขั้นต่ำจาก0.3นั้นสร้างอัลฟาที่เพิ่มขึ้นอย่างมากในขณะที่เราใกล้จะ0.0แตกต่างกัน

- 0.005ชดเชยเพียงแค่เพิ่มขอบสีขาวที่จะทำให้ "สี่แยก" หนา ลองปรับเปลี่ยนมัน!

gl_FragColor = vec4(vec3(1.0), alpha);

และสุดท้ายใช้อัลฟ่านั้นกับสีส่วนของคุณ


การเพิ่มประสิทธิภาพ

คุณสามารถทำให้โล่โค้งเพิ่มพลาสม่าสำหรับ "พลังงานโล่" มอง (สาธิต)หรือสำรวจผลกระทบที่มีเพียงแค่แยกแสดง (สาธิต)

ท้องฟ้ากราฟฟิกการ์ดของคุณมีขีด จำกัด !


โอ้ ของฉัน ข่าวดี. Ty สำหรับการกวดวิชาที่น่ากลัว
Blue Bug เมื่อ

5

มันใช้แผนที่ความลึก มันทำให้โลกสร้างวาทกรรมและสร้างความแตกต่างระหว่างค่าซีเรนเดอร์ของโล่กับค่าความลึกบัฟเฟอร์ซีเพื่อให้พิกเซลขาวมากขึ้น


3

ฉันไม่รู้ว่าคุณกำลังใช้ Engine ใด หรือภาษาที่คุณทำงานด้วย ถึงกระนั้นสิ่งที่คุณสามารถค้นหาออนไลน์ได้ส่วนใหญ่นั้นไม่ยากที่จะย้ายจากสภาพแวดล้อมหนึ่งไปอีกสภาพแวดล้อมหนึ่งเพื่อให้ได้สิ่งที่คุณต้องการ

และแน่นอนว่ามีเนื้อหาออนไลน์ที่สามารถช่วยเหลือคุณได้ ดูการสนทนาที่เกี่ยวข้องกับ Unity: http://www.superspacetrooper.com/2012/06/tutorial-force-field-weapon-impact-energy-dispersion/และคำถามนี้เกี่ยวข้องกับ UE4: https: //answers.unrealengine co.th ยกตัวอย่างเช่น Shader ที่สมบูรณ์การดำเนินการที่มีผลโล่จากการอภิปรายค่อนข้างล่าสุดใน Reddit คุณสามารถดู: https://www.reddit.com/r/Unity3D/comments/3edi0n/does_any_one_knows_how_to_make_this_shield_effect/ และสำหรับการกวดวิชาที่ไม่ได้เป็น ตรงนั้น แต่มีความเกี่ยวข้องมากพอที่จะสนใจ: http://www.nightbox-studios.com/2015/09/05/assets-shield-effect-scripts-for-texture3d-perlin-noise-shader/

นอกจากนี้ต่อไปนี้เป็นลิงก์สำหรับคำถามที่เกี่ยวข้อง 3 ข้อที่ทำไว้ก่อนหน้านี้ในเว็บไซต์นี้ซึ่งน่าจะช่วยได้มากในการเข้าใจแนวคิดเบื้องหลังสิ่งที่คุณต้องการบรรลุ:

ยานอวกาศ Shield Flare

วิธีการใช้โล่พลังงาน starwar ในเกม

เอฟเฟกต์โล่ XNA พร้อมปัญหาทรงกลมดั้งเดิม

ท้ายสุดมีการใช้งานตัวป้องกันเกราะที่ดีทั้งใน Unity และ Unreal Engine ในร้านค้าเสมือนจริงของพวกเขาหากคุณบังเอิญใช้เครื่องมือเหล่านี้ โดยทั่วไปแล้วเป็นสินทรัพย์ที่ได้รับค่าตอบแทน แต่มักจะเป็นโอเพ่นซอร์สหลังจากซื้อมา - และมักจะมีราคาถูก แม้ว่าคุณจะไม่ได้ใช้เครื่องมือเหล่านี้สินทรัพย์เหล่านั้นสามารถช่วยในการเล่นและเรียนรู้

หวังว่ามันจะช่วย


แม้ว่าลิงก์เหล่านั้นจะมีประโยชน์ แต่คำตอบนี้เป็นเพียงลิงก์และไม่ได้ตอบคำถามโดยตรง มันจะเป็นการดีกว่าถ้าจะแยกเนื้อหาที่เกี่ยวข้องของลิงค์ออกเป็นคำอธิบายที่แท้จริง
Anko

ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง - จากรีวิว
Vaillancourt

@ Anko แน่นอนว่าฉันไม่ดี ฉันมักจะมีคำอธิบายและชุดลิงก์ แต่คราวนี้คุณพูดถูกคำอธิบายที่แท้จริงหายไป ฉันอาจจะลบคำตอบแล้ว
58

@AlexandreVaillancourt ฉันไม่ชอบความคิดเพียงคัดลอกวางจากลิงค์อื่นแทนการเปลี่ยนเส้นทาง OP ไปยังแหล่งต้นฉบับ จากนั้นสิ่งที่ฉันคิดว่าดีที่สุดคือการให้ลิงก์ในความคิดเห็นกับคำถาม ปัญหาดังกล่าวคือเมื่อคุณทราบเนื้อหามากมายที่สามารถช่วยได้ แต่มันใหญ่เกินไปสำหรับความคิดเห็น แต่ถึงกระนั้นเนื่องจากคำตอบที่ดีคำตอบถูกโพสต์แล้วที่นี่ฉันจะลบหนึ่งนี้
MA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.