ฉันได้ศึกษาตัวอย่างของ 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 อาจเป็นขอบเขตล่างซึ่งเป็นมาตรการรักษาความปลอดภัย