เลนส์แก้วหักเหแสง


10

ฉันมีพื้นหกเหลี่ยมไม่สิ้นสุดสร้างโดย tessellating จุดตารางในคู่ shader tessellation:

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่านี่เป็นโครงลวดแบบเรียบ - "เงา" เป็นเคล็ดลับแสง:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันต้องการทำให้แก้วนี้ดูหนาและหักเหได้ แต่ไม่แน่ใจว่าจะดำเนินการต่อไปได้อย่างไร

สิ่งแรกที่อยู่ในใจคือ

  1. ตั้งค่าชุดที่ประกอบด้วย "ความหนา" ที่ร้องขอของบล็อก
  2. เมื่อคำนวณแสงให้ใช้กฎของสเนลล์เพื่อคำนวณความยาวเส้นทางแสงที่รังสีจะผ่านบล็อกเลขฐานสิบหกหากจริง ๆ แล้วมันมีความหนาเท่ากับชุด "ความหนา" กล่าวและรวมอัลฟากับความยาวนั้น ที่จะให้ความโปร่งใส แต่ไม่ได้จัดการกับสิ่งต่าง ๆ เช่นการสะท้อนภายใน / TIR ฯลฯ

ป้อนคำอธิบายรูปภาพที่นี่

ฉันยังไม่ได้ลองเลยดังนั้นฉันจึงไม่แน่ใจว่าผลลัพธ์ภาพจะเป็นอย่างไร

ในที่สุดสำหรับระดับนี้ฉันพยายามทำให้แก้วนั้นมีลักษณะเป็นพื้นหกเหลี่ยมที่ใช้ใน Tron: Legacy ระหว่างการต่อสู้แผ่นดิสก์ ( ดูภาพนี้เป็นตัวอย่าง )

ข้อเสนอแนะ?


1
คุณช่วยอธิบายเพิ่มเติมว่าคุณพยายามทำอะไรให้สำเร็จ ยิงตรอนแสดงให้เห็นถึงการสะท้อนส่วนใหญ่ AFAICT ไม่ใช่การหักเห - คุณไม่สามารถมองเห็นผ่านแผ่นพื้นในภาพส่วนใหญ่ สมมติว่าคุณไม่ต้องการแค่ผิวมันวาวคุณต้องการเห็นอะไรบนพื้น? มีพื้นผิวย่อยที่คุณต้องการแสดงหรือไม่? มีฉากทั้งหมดใต้พื้น (เหมือนในตรอน) ไหม หรือคุณต้องการให้มันเป็นเหมือนกระจกฝ้าซึ่งคุณไม่สามารถมองเห็นภาพที่แตกต่างได้ แต่มีเอฟเฟกต์การกระจายใต้ผิวดินหรือไม่?
นาธานรีด

การกระเจิงใต้ผิวดินแม้ว่าฉันไม่รู้ว่าเป็นสิ่งที่เรียกว่า ทำให้ Googling ง่ายขึ้น :)
3Dave

คำตอบ:


4

บทความใน GPU Gems นี้มีเนื้อหาเกี่ยวกับการหักเหของแสงซึ่งสามารถให้ผลลัพธ์ที่ยอดเยี่ยม

(a) ความโปร่งใสที่สมบูรณ์ (b) กระจกหักเห

ในความรู้สึกพื้นฐานที่สุด

ขั้นตอนแรกของเทคนิคการหักเหพื้นฐานคือทำให้ฉากเรขาคณิตเป็นพื้นผิวโดยข้ามตาข่ายหักเหทั้งหมด พื้นผิวนี้สามารถใช้เพื่อกำหนดว่าวัตถุใดที่สามารถมองเห็นได้หลังวัตถุการหักเหของแสงที่จะถูกแสดงผลในครั้งต่อไป เราแสดงว่าพื้นผิวนี้เป็น S

ขั้นตอนที่สองคือแสดงตาข่ายหักเหมองหาค่าจากพื้นผิว S ด้วยการรบกวนที่ใช้ในการจำลองลักษณะการหักเหของแสง การก่อกวนสามารถเกิดขึ้นได้โดยใช้แผนที่ N ที่ซึ่งส่วนประกอบแผนที่แดงและเขียว (XY) ถูกใช้และปรับขนาดด้วยค่าเล็กน้อยเพื่อเพิ่มการกระจัดในพิกัดพื้นผิวที่ฉาย วิธีนี้เป็นวิธีที่ง่ายต่อการนำไปใช้ใน shader:

  1. ดึงพื้นผิว N
  2. ใช้ส่วนประกอบ XY ที่ปรับสัดส่วนด้วยค่าเล็กน้อย (เช่น 0.05)
  3. เพิ่มค่าการกระจัดนี้ลงในพิกัดพื้นผิวที่ฉายสำหรับ S

รายการต่อไปนี้แสดง shader ที่แสดงให้เห็นถึงวิธีการนี้

half4 main(float2 bumpUV : TEXCOORD0,
  float4 screenPos : TEXCOORD1,
  uniform sampler2D tex0,
  uniform sampler2D tex1,
  uniform float4 vScale) : COLOR
{
  // fetch bump texture, unpack from [0..1] to [-1..1]
  half4 bumpTex=2.0 * tex2D(tex0, bumpUV.xy) - 1.0;

  // displace texture coordinates    
  half2 newUV = (screenPos.xy/screenPos.w) + bumpTex.xy * vScale.xy;

  // fetch refraction map
  return tex2D(tex1, newUV);
}

ภาพถัดไปแสดงให้เห็นถึงสามขั้นตอนเหล่านี้

สามขั้นตอนที่แสดงใน shader ด้านบน

มีเทคนิคขั้นสูงในบทความเดียวกันซึ่งสามารถทำให้ดูน่าสนใจมากขึ้น


สำหรับเอฟเฟกต์ที่คล้ายกันใน Unity คุณอาจต้องการดูหน้าวิกิการหักเหของแสง


3

ฉันจะถ่ายภาพที่คุณแสดงเป็นข้อมูลอ้างอิงว่าฉันจินตนาการถึงผลกระทบได้อย่างไร อัลกอริทึมที่ฉันนึกได้นั้นง่ายมาก:

  1. ทำให้สภาพแวดล้อมเป็นพื้นผิวแผนที่ลูกบาศก์เพื่อจำลองการสะท้อนสภาพแวดล้อม
  2. นำพื้นผิวแผนที่ลูกบาศก์มาใช้กับเครื่องบินที่แสดงถึงชั้นใต้พื้นการหักเหของแสง ยังไม่เรนเดอร์เครื่องบินเลย
  3. แสดงเครื่องบินเป็นพื้นผิวซึ่งเป็นพื้นผิว 2D ปกติ
  4. ส่งผ่านพื้นผิวไปยังเครื่องหักเหแสงที่ใช้ในการสร้างพื้นหักเห
  5. ตอนนี้ทำให้การหักเหของตาข่าย / พื้นด้วย shader การหักเหของแสง

ในส่วนของการหักเหของแสงนั้นเพื่อจำลองแก้วที่คุณสามารถทำได้

  • ใช้คำว่า fresnel เพื่อจำลองการสะท้อนและการหักเห
  • ใช้แผนที่ปกติ / แผนที่ปกติเพื่อดึงข้อมูลพื้นผิว

ฉันแค่คิดถึงความคิดดังนั้นฉันจึงไม่ได้ทดสอบ ฉันแน่ใจว่ามันต้องทำงานมากกว่านี้บางทีฉันจะทำเมื่อฉันกลับมาจากที่ทำงาน


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