ในศัพท์เทคนิคทั้งหมดfwidth(p)
หมายถึง
fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))
และdFdx(p)
/ dFdy(p)
เป็นผลสืบเนื่องบางส่วนของค่าที่p
เกี่ยวกับขนาดx
และy
หน้าจอ ดังนั้นพวกเขาจึงแสดงว่าค่าของp
พฤติกรรมเมื่อไปหนึ่งพิกเซลทางด้านขวา ( x
) หรือหนึ่งพิกเซลขึ้นไป ( y
)
ตอนนี้พวกเขาจะคำนวณได้อย่างไร ทีนี้ถ้าคุณรู้ค่าของเพื่อนบ้านพิกเซลสำหรับp
คุณสามารถคำนวณได้ว่าเป็นผลต่างทางตรงจำกัดเป็นการประมาณสำหรับอนุพันธ์ทางคณิตศาสตร์ที่แท้จริงของพวกเขา (ซึ่งอาจไม่มีวิธีการวิเคราะห์ที่แน่นอนเลย):
dFdx(p) := p(x+1) - p(x)
แต่แน่นอนตอนนี้คุณอาจถามว่าเราจะรู้ค่าของp
(ซึ่งอาจเป็นค่าที่คำนวณโดยพลการภายในโปรแกรม shader) สำหรับพิกเซลข้างเคียงได้อย่างไร เราจะคำนวณค่าเหล่านั้นได้อย่างไรโดยไม่เกิดค่าใช้จ่ายที่สำคัญเกิดขึ้นโดยทำการคำนวณ shader ทั้งหมดสองครั้งหรือสามครั้ง
ทีนี้คุณก็รู้แล้วว่าค่าที่อยู่ใกล้เคียงเหล่านี้ถูกคำนวณต่อไปเพราะพิกเซลที่อยู่ใกล้เคียงคุณก็มีส่วนย่อย ดังนั้นสิ่งที่คุณต้องมีก็คือการเข้าถึงการเรียกใช้ shader แฟรกเมนต์ที่อยู่ใกล้เคียงนี้เมื่อเรียกใช้สำหรับพิกเซลใกล้เคียง แต่มันง่ายยิ่งขึ้นเพราะค่าเพื่อนบ้านเหล่านั้นถูกคำนวณในเวลาเดียวกัน
แรสเตอร์เจอร์ที่ทันสมัยเรียก shader ส่วนในกระเบื้องขนาดใหญ่มากกว่าหนึ่งพิกเซลที่อยู่ใกล้เคียง ที่เล็กที่สุดนั้นจะเป็นตาราง 2x2 พิกเซล และสำหรับแต่ละบล็อกพิกเซลนั้น shader แฟรกเมนต์จะถูกเรียกใช้สำหรับแต่ละพิกเซลและการเรียกใช้เหล่านั้นจะทำงานในขั้นตอนการล็อคแบบขนานอย่างสมบูรณ์แบบดังนั้นการคำนวณทั้งหมดจะดำเนินการในลำดับเดียวกันและในเวลาเดียวกันสำหรับแต่ละพิกเซลในบล็อก (ซึ่งเป็นสาเหตุที่ทำให้แตกกิ่งในส่วนที่แตกในขณะที่ยังไม่ถึงตายควรหลีกเลี่ยงถ้าเป็นไปได้เนื่องจากการร้องขอบล็อกแต่ละบล็อกจะต้องสำรวจทุกสาขาที่ถูกยึดโดยการเรียกร้องอย่างน้อยหนึ่งครั้งแม้ว่ามันเพิ่งจะทิ้งไป ผลลัพธ์หลังจากนั้นก็เป็นไปตามคำตอบของคำถามที่เกี่ยวข้อง) ดังนั้นในทุกช่วงเวลาส่วนของ shader ในทางทฤษฎีสามารถเข้าถึงค่า shader ของพิกเซลที่อยู่ใกล้เคียงได้ และในขณะที่คุณไม่ได้มีการเข้าถึงโดยตรงกับค่าที่คุณมีการเข้าถึงค่าคำนวณจากพวกเขาเช่นฟังก์ชั่นอนุพันธ์dFdx
, dFdy
, fwidth
...
dFdx(p) = p(x1) - p(x)
เช่นนั้นx1
อาจเป็น(x+1)
หรือ(x-1)
ขึ้นอยู่กับตำแหน่งของพิกเซลx
ในรูปสี่เหลี่ยม ไม่ว่าจะด้วยวิธีใดx1
ต้องอยู่ในรูปวาร์ป / คลื่นเหมือนx
กัน ฉันถูกไหม?