ddx (hlsl) ทำอะไรได้จริง?


17

ฉันสับสนเล็กน้อย เอกสารอย่างเป็นทางการ ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509588(v=vs.85).aspx ) กล่าวว่า ddx (อินพุต) เป็นอนุพันธ์ย่อยของอินพุตด้วยความเคารพ ถึง "การเว้นวรรค x หน้าจอพิกัด"

แคลคูลัสของฉันใช้ได้ แต่มันจะบอกได้อย่างไรว่าอินพุทนั้นมาจากไหน? ถ้าฉันผ่านฟังก์ชั่นก็ดีฉันสามารถจินตนาการได้ว่ามันจะทำอะไร แต่อนุพันธ์ของตัวเลขนั้นจะเป็นศูนย์เสมอ ... ?

มันเป็นเพียงการปรับขนาดหรือไม่? เช่นนี้จะถูกลดขนาดเป็นหนึ่งในสิบของขนาดระยะทางนี้ดังนั้นจะคืนหนึ่งในสิบหรือไม่ แต่ไม่จำเป็นต้องป้อนข้อมูล ...

บางคนสามารถให้คำอธิบายอย่างรวดเร็วว่าเกิดอะไรขึ้นจริงหรือ


2
ddxและddyทำเวทมนต์ที่คุณไม่สามารถทำเองได้ พวกเขาสามารถเข้าถึงข้อมูลเพิ่มเติมจากไปป์ไลน์ rasterization ที่คุณไม่สามารถหาได้จากภายในตัวปรับพิกเซล ฉันไม่แน่ใจว่าจะใช้สูตรใด ฉันถูกชักนำให้เชื่อว่าพวกเขาใช้เทคนิคการประมาณค่า แต่ไม่รู้แน่ชัด
Sean Middleditch

มันแปลกมาก แต่ก็ยังอยู่ ddx (5) เป็นตัวแทนอะไร ถ้ามันบอกว่า. 1 ฉันจะตีความได้อย่างไร หรือ -6
Richard Rast

1
ddx(5)ไม่มีจุดหมาย ใช้กับค่าอินพุตและนั่นจะให้อนุพันธ์ของค่านั้นเทียบกับพิกเซลข้างเคียงในบล็อก อีกครั้งฉันไม่รู้ว่ามันคำนวณค่าอย่างไร แต่การขออนุพันธ์ของ non-input อาจเป็นพฤติกรรมที่ไม่ได้กำหนดและผลิตขยะ ดูfgiesen.wordpress.com/2011/07/10/…สำหรับข้อมูลเพิ่มเติมมากกว่าที่ฉันสามารถให้ได้
Sean Middleditch

ฉันไม่แน่ใจ แต่อาจเป็นไปได้ว่าคอมไพเลอร์ HLSL กำลังสร้างความแตกต่างเชิงสัญลักษณ์แบบเต็มของนิพจน์ที่คุณส่งไปยัง ddx / ddy blogs.msdn.com/b/chuckw/archive/2011/03/08/.. research.microsoft.com/pubs/146019/…
Ziriax

มันทำอะไร? เฉพาะสิ่งที่เหมาะสมเล็กน้อยอย่างเห็นได้ชัด
MickLH

คำตอบ:


32

ภายใน GPUs ไม่เคยเรียกใช้ pixel shader ทีละตัวอย่าง ในระดับที่ดีที่สุดของความละเอียดระดับพิกเซลพวกเขามักใช้งาน 32-64 พิกเซลพร้อมกันโดยใช้สถาปัตยกรรม SIMD ภายในจุดนี้พิกเซลจะถูกจัดระเบียบเป็น 2x2 quads ดังนั้นแต่ละกลุ่มของพิกเซลที่ต่อเนื่องกัน 4 อันในเวกเตอร์ SIMD จะสอดคล้องกับ 2x2 บล็อกของพิกเซลบนหน้าจอ

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

เนื่องจาก pixel shader ทำงานใน SIMD จึงรับประกันได้ว่าค่าที่เกี่ยวข้องนั้นอยู่ในการลงทะเบียนเดียวกันพร้อมกันสำหรับพิกเซลทั้งหมดในรูปสี่เหลี่ยม ดังนั้นการแสดงออกหรือค่าใด ๆ ที่คุณใส่เข้าไปddxหรือddyมันจะถูกประเมินในสี่พิกเซลทั้งหมดของรูปสี่เหลี่ยมจากนั้นค่าจากพิกเซลที่แตกต่างกันจะถูกลบออกตามที่อธิบายไว้ข้างต้น

ดังนั้นการหาอนุพันธ์ของค่าคงที่จะให้ศูนย์ (อย่างที่คุณคาดหวังจากแคลคูลัสใช่ไหม) เพราะมันเป็นค่าคงที่ที่เหมือนกันในพิกเซลทั้งสี่

นอกจากนี้ยังทราบว่ามี "หยาบ" และ "ดี" อนุพันธ์ddx_coarse/ ddy_coarseและ/ddx_fine ddy_fineคำอธิบายของความแตกต่างจะได้รับที่นี่ เพียงแค่ธรรมดาddx/ ddyเป็นนามแฝงสำหรับรุ่นที่หยาบ

BTW เหตุผลที่ฟังก์ชั่นนี้มีอยู่คือ GPU ต้องใช้อนุพันธ์ของพิกัดพื้นผิวเพื่อทำการเลือก mipmap และการกรองแบบแอนไอโซทรอปิก เนื่องจากฮาร์ดแวร์ต้องการความสามารถอยู่แล้ว (คุณสามารถใช้นิพจน์โดยพลการใด ๆ สำหรับพิกัดพื้นผิวใน shader), มันง่ายพอที่จะให้มันสัมผัสกับโปรแกรมเมอร์ shader โดยตรง


+1; ฉันพบว่ามีประโยชน์เมื่อใช้เอฟเฟกต์การก่อกวนในพื้นผิว texcoords ที่ถูกรบกวนให้สีเพี้ยน แต่การใช้ tex2Dgrad กับอนุพันธ์จาก texcoords ดั้งเดิม (ไม่ถูกรบกวน) ให้ผลที่ไม่แตกกัน
Maximus Minimus

เอาล่ะหลังจากความคิดบางอย่างฉันคิดว่าฉันเข้าใจความสับสน ในใจของฉันddxทำงานเหมือนฟังก์ชั่นอื่น ๆ ทั้งหมดในภาษาการเขียนโปรแกรมดั้งเดิม คุณประเมินค่าอินพุตเปลี่ยนเป็นโฟลว์หรืออะไรก็ตามจากนั้นทำฟังก์ชันภายนอก ( ddx) กับมัน แต่สิ่งนี้แตกต่างกัน - มันต้องใช้สตริงป้อนเข้า, ประเมินมันในหลาย ๆ ที่, คำนวณอนุพันธ์และรายงานผลลัพธ์ มันเกี่ยวกับใช่มั้ย
Richard Rast

1
@RichardRast ใช่ คุณอาจจะคิดว่าddxเป็นการดำเนินงานในการแสดงออกของคุณผ่านเข้ามันมากกว่ามูลค่า
นาธานรีด

แต่ดูสิมันแปลกมากที่ควรอยู่ในเอกสารประกอบ ฉันไม่คิดว่าจะมีเวลาใดในชีวิตการเขียนโปรแกรมของฉันในกรณีนี้
Richard Rast

Nathan Reed กล่าวว่า GPU ใช้ฟังก์ชั่นเหล่านี้สำหรับการเลือก mipmap คุณสามารถใช้พวกมันเพื่อบังคับให้ GPU เพื่อเลือกระดับ mipmap ที่ต้องการหรือเพื่อป้องกันสิ่งประดิษฐ์จากการเลือกระดับ mip ที่ไม่ถูกต้อง กระบวนการนี้อธิบายไว้ในหน้า 163 และ 164 ของ Shader X3
JamesHoux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.