อนุพันธ์ของอวกาศสกรีนคืออะไรและเมื่อใดที่ฉันจะใช้


12

ฉันเห็นฟังก์ชั่นddxและddyglsl และการเทียบเท่า hlsl เกิดขึ้นในรหัส shader ทุก ๆ ครั้งแล้ว ขณะนี้ฉันกำลังใช้พวกมันเพื่อทำแผนที่ bump โดยไม่มีการแทนเจนต์หรือ bitangent แต่โดยทั่วไปฉันคัดลอกวางโค้ด ฉันไม่เข้าใจว่าฟังก์ชั่นเหล่านี้คืออะไรพวกเขาทำอะไรและเมื่อใดที่ฉันจะใช้มัน

ดังนั้นคำถาม:

  1. ฟังก์ชันอนุพันธ์หน้าจอคืออะไร?
  2. ฟังก์ชั่นเหล่านี้ทำอะไร? ค่าอินพุตและค่าเอาต์พุต
  3. ลักษณะพิเศษใดที่ใช้บ่อยที่สุด
  4. เอฟเฟกต์ประเภทใดที่คุณต้องมองไปที่ฟังก์ชันเหล่านี้

ในอดีตที่ผ่านมาฉันใช้สิ่งเหล่านี้สำหรับการแปรปรวนแบบพื้นผิวโดยที่การแปรปรวนอาจทำให้ miplevel ที่ไม่ถูกต้องได้รับเลือกสำหรับบางส่วน โดยทั่วไปแล้วจะเป็น miplevel ต่ำกว่าดังนั้นคุณจะเห็นพื้นผิวที่เปลี่ยนไปอย่างเห็นได้ชัดในขณะที่มันแปรปรวน การใช้อนุพันธ์ของ texcoords ที่ไม่ได้เตรียมไว้จากนั้นคำนวณ warp จากนั้นใช้ tex2Dgrad / SampleGrad / textureGrad ด้วย texcoords ที่ได้รับการแปรปรวนและอนุพันธ์ป้องกันไม่ให้สิ่งนี้เกิดขึ้น
Maximus Minimus

@ LeComteduMerde-fou พื้นผิววาร์ปคืออะไร? Google ด่วนแนะนำให้คุณหมายถึงการห่อ?
NeomerArcana

ไม่ฉันหมายถึงวาร์ปคือการบิดเบือนพื้นผิวโดยการเปลี่ยน coords พื้นผิวเมื่อเวลาผ่านไป
Maximus Minimus

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

สวัสดีฉันสนใจมากในตอนนี้ฉันกำลังใช้พวกเขาเพื่อทำแผนที่การชนโดยไม่มีการสัมผัสหรือ bitangent แต่โดยทั่วไปฉันคัดลอกวางโค้ด ... ฉันกำลังคิดที่จะใช้สิ่งนั้น ... แต่ฉันไม่รู้ว่าจะแปลงอนุพันธ์อวกาศหน้าจอเหล่านี้ให้เป็นบรรทัดฐานโลกอวกาศโดยใช้พีชคณิตเชิงเส้นราคาถูกได้อย่างไร บางทีฉันอาจต้องการเมทริกซ์การฉายภาพจากกล้อง
Prokop Hapala

คำตอบ:


12

อันดับแรกจะช่วยให้ทราบได้ว่า 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 ด้วยตนเองอาจผิดนัดอนุพันธ์หยาบ)


เมื่อคุณบอกว่ามันเป็นความแตกต่างระหว่างพิกเซลจากด้านหนึ่งของบล็อก 2x2 ไปยังอีกบล็อกหนึ่งมันคือความแตกต่างของค่าพิกเซลหรือความแตกต่างในตำแหน่งเท็กเซลหรือไม่? หากเป็นความแตกต่างของมูลค่ามันจะรวมจำนวนข้อความในระหว่างหรือบางสิ่ง?
NeomerArcana

มันคือความแตกต่างในค่าของการโต้แย้ง ( vที่นี่) และเนื่องจากมันเป็นรูปสี่เหลี่ยม 2x2 จึงไม่มีพิกเซลอยู่ระหว่างนั้น ดังนั้นถ้าเราแรเงาส่วนบนซ้ายของรูปสี่เหลี่ยมและ v = 1 ตรงนั้นและในส่วนบนขวา v = 4 ดังนั้น ddx (v) = 3 (พูดว่า "v เพิ่มขึ้น 3 ในขณะที่เราเคลื่อนที่ จากซ้ายไปขวา ")
DMGregory

ฉันยังไม่ค่อยเข้าใจ หากฉันกำลังดูเป็นมุมบล็อก 2x2 อาจไม่ได้ประกอบขึ้นจากพิกเซลแบบเคียงข้างกันในพื้นผิว ดังนั้นความแตกต่างของค่ามันเป็นความแตกต่างระหว่างสองเท็กซัสที่เลือกหรือไม่หรือความแตกต่างระหว่างสองเท็กซัสที่เลือกใช้ในการพิจารณาสิ่งที่ข้าม?
NeomerArcana

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

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