เหตุใดการเข้าถึงพื้นผิวจึงช้าลงมากเมื่อคำนวณพิกัดพื้นผิวในส่วนของส่วน


11

เมื่อใช้พื้นผิวใน GLSL วิธีที่ดีที่สุดคือการคำนวณพิกัดพื้นผิวสุดท้ายใน shader ที่จุดสุดยอดและส่งให้กับ shader ของชิ้นส่วนโดยใช้varyings ตัวอย่างที่มีการพลิกง่าย ๆ ในพิกัด y:

// Vertex shader
attribute vec2 texture;
varying highp vec2 texCoord;
// ...
void main() {
    texCoord = vec2(texture.x, 1.0-texture.y);
    // ...
}

// Fragment shader
varying highp vec2 textureCoordinates;
uniform sampler2D tex;
// ...
void main() {
    highp vec4 texColor = texture2D(tex, texCoord);
    // ...
}

หากการพลิกในพิกัด y หรือการดำเนินการที่ง่ายยิ่งขึ้นเช่นการเพิ่มvec2(0.5)ลงในพิกัดพื้นผิวจะดำเนินการในส่วนของ shader การเข้าถึงพื้นผิวจะช้ากว่ามาก ทำไม?


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


1
ฉันเดาว่าถ้าคำนวณ coords UV เป็น VS หน่วยเนื้อสัมผัสสามารถเริ่มดึงมันล่วงหน้าได้ในขณะที่ PS กำลังเริ่มต้น หากคำนวณใน PS หน่วยเนื้อต้องรอก่อน
RichieSams

2
Fwiw สิ่งนี้เรียกว่า "การอ่านพื้นผิวที่ขึ้นต่อกัน" ในกรณีที่ช่วยค้นหาของคุณ
Alan Wolfe

คุณมีการวัดที่แสดงถึงความแตกต่างอย่างสมบูรณ์หรือไม่? จริง ๆ แล้วฉันไม่คาดหวังว่าจะมีความแตกต่างอย่างมากเลย การดึงข้อมูลพื้นผิวเวลาในการตอบสนองควรเพิ่มค่า ALU สองสามตัว BTW การอ่านพื้นผิวที่ขึ้นต่อกันคือที่ซึ่งมีสองพื้นผิว (หรือมากกว่า) อ่านพื้นผิวด้วยพิกัดสำหรับวินาทีขึ้นอยู่กับการส่งออกของครั้งแรก สิ่งเหล่านี้ช้าลงเนื่องจากมีการสั่งซื้อที่เข้มงวดระหว่างสองพื้นผิวที่อ่าน
นาธานรีด

การดำเนินการใด ๆ ที่กระทำใน shader ส่วนจะมีราคาแพงกว่าในส่วนยอด แต่ละสามเหลี่ยมใช้เวลา 3 invocations ของจุดสุดยอด shader แต่มันอาจใช้คำสั่งของขนาดที่เพิ่มขึ้น invocations ของ shader ชิ้นส่วนขึ้นอยู่กับขนาดของหน้าจอ
glampert

@NathanReed ฉันไม่คิดว่าคุณจะต้อง จำกัด "การอ่านพื้นผิวที่ขึ้นต่อกัน" กับผู้ที่มาจากการเข้าถึงพื้นผิวก่อนหน้านี้ ฉันอาจจะรวมพิกัดใด ๆ ที่คำนวณใน Frag Shader ซึ่งตรงข้ามกับพิกัดที่สามารถกำหนดได้จากการประมาณค่าเชิงเส้น (ซึ่งเป็นไฮเพอร์โบลิกกับเปอร์สเปคทีฟ) ในเชิงเส้นตรง
Simon F

คำตอบ:


11

สิ่งที่คุณกำลังพูดถึงมักเรียกว่า "การอ่านพื้นผิวที่พึ่งพา" ในชุมชนการพัฒนาอุปกรณ์พกพา มันเป็นรายละเอียดการใช้งานของฮาร์ดแวร์บางตัวและดังนั้นมันจึงขึ้นอยู่กับ GPU ว่ามีความเกี่ยวข้องกับประสิทธิภาพหรือไม่ โดยทั่วไปแล้วเป็นสิ่งที่คุณเห็นว่าใช้กับ PowerVR GPU ในฮาร์ดแวร์ Apple เนื่องจากมีการกล่าวถึงอย่างชัดเจนทั้งในImaginationและAppleเอกสาร ถ้าฉันจำได้อย่างถูกต้องปัญหานั้นมาจากฮาร์ดแวร์ใน GPU ที่จะเริ่มดึงพื้นผิวล่วงหน้าก่อนที่ชิ้นส่วนจะเริ่มทำงานเพื่อให้สามารถซ่อนความหน่วงได้ดีขึ้น เอกสารที่ฉันเชื่อมโยงพูดถึงว่ามันไม่มีปัญหากับฮาร์ดแวร์ Series6 ดังนั้นอย่างน้อยในฮาร์ดแวร์ Apple รุ่นใหม่ไม่ใช่สิ่งที่คุณต้องกังวล ฉันไม่แน่ใจเกี่ยวกับ GPU ของอุปกรณ์พกพาอื่น ๆ อย่างสุจริตเพราะนั่นไม่ใช่ความเชี่ยวชาญของฉัน คุณควรลองศึกษาเอกสารประกอบของพวกเขาเพื่อตรวจสอบ

หากคุณตัดสินใจที่จะทำการค้นหาของ Google ในเรื่องนี้โปรดทราบว่าคุณอาจพบเนื้อหาที่เก่ากว่าที่พูดถึงการดึงพื้นผิวที่ขึ้นอยู่กับฮาร์ดแวร์เดสก์ท็อปรุ่นเก่า พื้นฐานในวันแรก ๆ ของการพิกเซล / แฟรกเมนต์ชิ้นส่วนคำว่า "การดึงข้อมูลพื้นผิวแบบพึ่งพา" เรียกว่าการใช้ที่อยู่ UV ที่อาศัยการดึงข้อมูลพื้นผิวก่อนหน้า ตัวอย่างคลาสสิกคือการเรนเดอร์แผนที่สภาพแวดล้อมแบบ bump-mapped ซึ่งคุณต้องการใช้เวกเตอร์การสะท้อนตามแผนที่ปกติเพื่อสุ่มตัวอย่างแผนที่สภาพแวดล้อม ในฮาร์ดแวร์รุ่นเก่านี้มีนัยสำคัญเกี่ยวกับประสิทธิภาพการทำงานและฉันคิดว่ามันไม่ได้รับการสนับสนุนแม้แต่ใน GPU ที่เก่ามาก ด้วย GPU ที่ทันสมัยฮาร์ดแวร์และ shader ISA นั้นเป็นแบบทั่วไปมากขึ้นดังนั้นสถานการณ์ด้านประสิทธิภาพจึงมีความซับซ้อนมากขึ้น


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