อันดับแรกจะช่วยให้ทราบได้ว่า GPU จะประเมินความแตกต่างของส่วน / พิกเซลในแต่ละครั้งที่ 2x2 บล็อก (แม้ว่าจะต้องมีเพียงบางส่วนของพิกเซลเหล่านั้นในที่สุดก็จะต้องถูกดึงออกมาในขณะที่คนอื่นอยู่นอกรูปหลายเหลี่ยมหรือถูกบดบัง - เศษเล็กเศษน้อยที่ไม่จำเป็นออกไปจะถูกพรางออกมา
อนุพันธ์ของหน้าจอสเปซของตัวแปร (หรือนิพจน์) v
ใน shader ของคุณคือความแตกต่างในค่าของv
(ณ จุดนั้นในรหัส) จากด้านหนึ่งของ 2x2 พิกเซลรูปสี่เหลี่ยมนี้กับอีกด้านหนึ่ง กล่าวคือ ddx
คือค่าของv
ในพิกเซลด้านขวาลบด้วยค่าของv
ด้านซ้ายและในทำนองเดียวกันสำหรับddy
ในแนวตั้ง
คำตอบนี้ " v
เพิ่มขึ้นหรือลดลงเร็วแค่ไหนเมื่อเราเคลื่อนที่ในแนวนอน (ddx) หรือแนวตั้ง (ddy) ผ่านหน้าจอ" - เช่น ในแง่แคลคูลัสมันประมาณอนุพันธ์บางส่วนของตัวแปรของคุณ (โดยประมาณเพราะมันใช้ตัวอย่างที่ไม่ต่อเนื่องในแต่ละส่วนแทนที่จะใช้การประเมินทางคณิตศาสตร์เพื่อประเมินพฤติกรรมที่น้อยที่สุดของฟังก์ชัน)
สำหรับปริมาณสเกลาร์เราสามารถดูนี่เป็นเวกเตอร์ไล่ระดับสี ∇v = float2(ddx(v), ddy(v))
ซึ่งชี้ไปตามทิศทางหน้าจอที่v
เพิ่มขึ้นอย่างรวดเร็วที่สุด
ข้อมูลประเภทนี้มักใช้ภายในเพื่อเลือกmipmapหรือเคอร์เนลการกรอง anisotropicที่เหมาะสมสำหรับการค้นหาพื้นผิว ตัวอย่างเช่นหากกล้องของฉันมีลักษณะเกือบขนานกับแนวตั้งuv
ของระนาบพื้นผิวที่ddy(uv.y)
มีขนาดใหญ่มากเมื่อเทียบกับddx(uv.x)
(เนื่องจากแกนแนวตั้งถูกกำหนดไว้ล่วงหน้าบนหน้าจอ - พิกเซลหนึ่งก้าวในแนวตั้งจะครอบคลุมพื้นที่พื้นผิวที่ยาวขึ้น) บอกฮาร์ดแวร์การสุ่มตัวอย่างพื้นผิวว่าฉันต้องการตัวกรอง anisotropic เพื่อเบลอทิศทางพื้นผิวแนวตั้งมากกว่าแนวนอนเพื่อหลีกเลี่ยงการสร้างสมนาม
สำหรับเอฟเฟ็กต์ที่ง่ายที่สุดคุณไม่จำเป็นต้องใช้อนุพันธ์เหล่านี้เนื่องจากวิธีการสุ่มตัวอย่างพื้นผิว 2D พื้นฐานจัดการให้คุณได้ แต่ตามที่ Le Comte du Merde-fou กล่าวถึงในความคิดเห็นข้างต้นเมื่อคุณบิดเบือนการค้นหาพื้นผิวของคุณคุณอาจต้องดึงและ / หรือนวดอนุพันธ์ของหน้าจอที่จะใช้ด้วยตนเองเพื่อช่วยให้ฮาร์ดแวร์เลือกการกรองที่เหมาะสม (เช่นผ่านtex2Dlod
ใน HLSL)
Screenpace decals เป็นกรณีหนึ่งซึ่งบล็อก 2x2 เดียวสามารถครอบคลุมความไม่ต่อเนื่องของการข้ามขนาดใหญ่ในพิกัดพื้นผิวที่คำนวณได้ซึ่งนำไปสู่ขอบที่เปื้อนหรือนามแฝงหากคุณให้ระบบคำนวณระดับการกรองอย่างไร้เดียงสา บทความนี้เข้าไปในรายละเอียดเกี่ยวกับสิ่งประดิษฐ์นี้และวิธีการเพื่อลดความมัน
อนุพันธ์เหล่านี้ยังมีประโยชน์เมื่อคุณใช้ฟังก์ชั่นเสียงรบกวนในการสร้างพื้นผิวตามขั้นตอน ถ้าบอกว่าคุณต้องการเปลี่ยนสัญญาณรบกวนขั้นตอนให้เป็นแผนที่ปกติ ddx & ddy ให้วิธีง่ายๆในการคำนวณว่าค่าเสียงเปลี่ยนแปลงในบริเวณใกล้เคียงของชิ้นส่วนปัจจุบันอย่างไรและมันลาดชันอย่างไร สามารถสร้างแบบปกติที่เหมาะสม
เทคนิคในการเรนเดอร์แบบเส้นตรงหรือไฮไลต์จุดตัดอาจใช้อนุพันธ์พื้นที่หน้าจอเพื่อให้แน่ใจว่าความหนา / การหลุดร่วงนั้นสอดคล้องกันและไม่ขึ้นอยู่กับรูปทรงเรขาคณิตหรือมุมมอง
ในการพูดคุยนี้เกี่ยวกับการเรนเดอร์ทรายใน Journeyผู้พูดกล่าวว่าพวกเขาสามารถใช้ฟังก์ชั่นอนุพันธ์เหล่านี้เพื่อควบคุมว่าประกายไฟของทรายอยู่ตามขอบของสายตา ... หากพวกเขารู้จักพวกเขาในเวลานั้น ซึ่งภายใต้ประทุนนั้นใช้พลังงานจากอนุพันธ์ประเภทนี้อยู่แล้ว)
หนึ่งบันทึกล่าสุดที่ควรระวัง: อนุพันธ์ของหน้าจอสามารถคำนวณได้ที่ "หยาบ" / ความแม่นยำต่ำ (หมายถึงหนึ่งคู่ของสัญญาซื้อขายล่วงหน้าที่ใช้ร่วมกันโดยทั้งรูปสี่เหลี่ยม) หรือ "ดี" / ความแม่นยำสูง (ความหมายของแต่ละพิกเซลจะเปรียบเทียบ เพื่อนบ้านในลานกว้างซึ่งสามารถให้คู่อนุพันธ์ที่แตกต่างกันสี่คู่บนลานกว้าง) โดยทั่วไปแล้วหยาบมีมากมาย แต่ถ้าคุณสังเกตเห็นว่าคุณเห็นบล็อก 2x2 ในเอฟเฟกต์ของคุณมันเป็นเงื่อนงำที่ดีที่คุณต้องการเปลี่ยนเป็นความละเอียดสูง / ความแม่นยำสูง ;)
(ในไดอะแกรมที่ด้านบนฉันใช้การคำนวณหาอนุพันธ์ดี แต่ระวังว่าเพียงแค่ ddx / ddy ด้วยตนเองอาจผิดนัดอนุพันธ์หยาบ)