การบัญชีสำหรับคลื่นเมื่อทำการสะท้อนระนาบ


13

ฉันได้ศึกษาตัวอย่างของ Nvidia จาก SDK โดยเฉพาะโครงการIsland11และฉันพบบางสิ่งที่อยากรู้เกี่ยวกับรหัส HLSL ชิ้นหนึ่งซึ่งแก้ไขการสะท้อนขึ้นและลงตามสถานะความสูงของคลื่น

โดยธรรมชาติหลังจากตรวจสอบย่อหน้าสั้น ๆ ของรหัส:

// calculating correction that shifts reflection up/down according to water wave Y position
float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix);
float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;
projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix);
waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;
reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y);

การคาดเดาครั้งแรกของฉันคือมันชดเชยการสะท้อนภาพถ่ายเมื่อถูกก่อกวนในแนวดิ่ง (คลื่น) ขยับเรขาคณิตที่สะท้อนกลับไปยังจุดที่ไม่มีอะไรเกิดขึ้นและน้ำจะปรากฏขึ้นราวกับว่าไม่มีอะไรอยู่หรือแค่ท้องฟ้า:

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

ทีนี้, นั่นคือท้องฟ้าที่สะท้อนให้เห็นซึ่งเราควรเห็นการสะท้อนสีเขียว / เทา / เหลืองของภูมิประเทศที่ lerped กับแนวของน้ำ ปัญหาของฉันคือตอนนี้ฉันไม่สามารถระบุได้ว่าอะไรคือตรรกะที่อยู่เบื้องหลัง การคาดการณ์ตำแหน่งอวกาศของโลกที่แท้จริงของจุดของรูปคลื่น / น้ำแล้วคูณด้วย -.5f เพื่อฉายอีกจุดเดียวเท่านั้นคราวนี้พิกัด y เปลี่ยนเป็น -0.8 (ทำไม -0.8?)

เบาะแสในรหัสดูเหมือนจะบ่งบอกว่ามันมาพร้อมกับการลองผิดลองถูกเพราะมีความซ้ำซ้อน ตัวอย่างเช่นผู้เขียนใช้เวลาครึ่งลบของพิกัด y ที่คาดการณ์ (หลังจากหารด้วย w):

float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;

จากนั้นทำเช่นเดียวกันสำหรับจุดที่สอง (บวกเท่านั้นเพื่อให้ได้ความแตกต่างของการเรียงลำดับฉันเข้าใจ) และรวม:

waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;

โดยการลบการหารด้วย 2 ฉันไม่เห็นความแตกต่างในการปรับปรุงคุณภาพ (ถ้ามีคนสนใจที่จะแก้ไขฉันโปรดทำ) ปมของมันน่าจะเป็นความแตกต่างใน y ที่คาดการณ์ไว้ทำไมล่ะ? ความซ้ำซ้อนและการเลือก -.8f และ -0.15f ที่ดูเหมือนว่าจะนำฉันไปสู่ข้อสรุปว่านี่อาจเป็นการผสมผสานระหว่างฮิวริสติก / เดางาน มีเหตุผลสนับสนุนนี้หรือเป็นเพียงแฮ็คหมดหวัง?

นี่คือการพูดเกินจริงของปัญหาเริ่มต้นซึ่งการแก้ไขส่วนรหัสสังเกตในระดับ tessellation ต่ำสุด หวังว่ามันอาจจุดประกายความคิดที่ฉันหายไป -.8f อาจจะเป็นความสูงอ้างอิงที่จะอนุมานว่าจะรบกวนการประสานงานของพื้นผิวมากแค่ไหนการสุ่มตัวอย่างเรขาคณิตที่สะท้อนบนผิวระนาบและ -.15f อาจเป็นขอบเขตล่างซึ่งเป็นมาตรการรักษาความปลอดภัย

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

คำตอบ:


1

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


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