สำหรับคณิตศาสตร์การแปรปรวนที่เกิดขึ้นจริงสิ่งนี้อาจซับซ้อนมากทำไมคุณไม่เริ่มที่นี่ .
ตอนนี้ฉันจะพูดเกี่ยวกับวิธีการที่คุณสามารถนำไปใช้นี้สมมติว่าคุณมีคณิตศาสตร์อยู่แล้วสำหรับวิธีที่คุณจะทำให้การเสียรูปของคุณ
2 วิธี:
1) ทุกเฟรมเยี่ยมชมทุกจุดยอดในรูปแบบกระบอกสูบและชดเชยด้วยวิธีใดวิธีหนึ่ง
2) ชดเชยจุดยอดในส่วนยอดขณะที่คุณกำลังแสดงผล OpenGL ES 2.0 รองรับเครื่องแปลงยอด ดังนั้นคุณจะโชคดี
คุณต้องการที่จะวาร์ปวัตถุตามที่ปรากฏบนหน้าจอหรือคุณต้องการที่จะวาร์ปวัตถุเพื่อให้ทุกวัตถุในเกมรู้ว่ามันได้รับการเปลี่ยนรูป?
หากคุณวิปริตวัตถุใน Shader จุดสุดยอดที่แล้วที่เกิดขึ้นเฉพาะในทันทีก่อนที่จะแสดงผล / แรสเตอร์ดังนั้นนี้หมายความว่าไม่มีวัตถุเกมจะรู้เกี่ยวกับการเสียรูป นี่เป็นเรื่องปกติถ้าคุณเพียงแค่สร้างโปรแกรมรักษาหน้าจอหรือหากการเปลี่ยนรูปมีขนาดเล็กมากจนไม่มีผลกระทบกับรูปร่างของวัตถุ
เมื่อคุณบิดรูปทรงเรขาคณิตในส่วนShader ที่ จุดที่เดิมของรุ่นจริงไม่ย้าย (พวกเขาเท่านั้นที่ปรากฏจะย้าย )
ความผิดปกติใน Shader ที่
undeformed:
พิการ
นี่คือจากบทที่ 6 ของการสอน cg (โปรแกรม # 14)
รหัส shader เพื่อสร้างความผิดปกตินี้เป็นสิ่งที่ต้องการ
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
ดังนั้นคุณสามารถเห็นสิ่งนี้เกิดขึ้นแสดงก่อนที่จะเกิดขึ้น (จุดสุดยอด shader เกิดขึ้นบน GPU) ดังนั้นรหัสซีพียูจึงไม่มีทางเข้าถึงตำแหน่งเวอร์เท็กซ์ที่แปลงสภาพ (มีวิธีส่งข้อมูลจาก GPU ไปยัง CPU (โดยหลักผ่านพื้นผิว) จะไม่ไปที่นั่น)