ประสิทธิภาพของกราฟิกแบบเวกเตอร์เทียบกับบิตแมปหรือกราฟิกแรสเตอร์


20

บางครั้งฉันใช้กราฟิกแบบเวกเตอร์เพียงเพราะพวกเขาดูดีกว่าเล็กน้อยในบางกรณีและบางครั้งฉันก็ใช้กราฟิกบิตแมป / แรสเตอร์

ฉันสงสัยว่ามีตัวเลือกประสิทธิภาพแตกต่างกันระหว่างสองตัวเลือกเหล่านี้หรือไม่


6
จริงๆแล้วมันขึ้นอยู่กับหลาย ๆ ปัจจัย NVIDIA ให้การเร่งด้วยฮาร์ดแวร์สำหรับกราฟิกแบบเวกเตอร์ คุณเคยเห็นไหม developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

คำตอบ:


15

ดังที่ TheBuzzSaw กล่าวขึ้นอยู่กับหลายสิ่งหลายอย่างรวมถึงการใช้งานกราฟิกแรสเตอร์และกราฟิกเวกเตอร์

ต่อไปนี้เป็นวิธีเวกเตอร์กราฟิกประสิทธิภาพสูงที่แสดงผลโดยใช้วิธีการแรสเตอร์แบบดั้งเดิม

Loop และ Blinn แสดงวิธีการแสดงกราฟิกเวกเตอร์โค้ง bezier กำลังสองโดยการแสดงสามเหลี่ยมเดียวและการใช้พิกัดพื้นผิวใน shader พิกเซลเพื่อบอกว่าพิกเซลอยู่เหนือหรือใต้โค้ง: http: //www.msr-waypoint สุทธิ / en-US / หนอ / คน / cloop / LoopBlinn05.pdf

แนวคิดพื้นฐานคือคุณตั้งค่าตำแหน่งมุมสามเหลี่ยมของคุณให้เป็นตำแหน่งจุดควบคุม 3 จุดและคุณตั้งค่าพิกัดพื้นผิวที่แต่ละมุมให้เป็น (0,0), (0.5,0) และ (1,1) ตามลำดับ ใน shader ของคุณถ้าพิกัดพื้นผิวการประมาณค่า (x * xy) เป็น <0 พิกเซลจะอยู่ใต้ส่วนโค้งมิฉะนั้นจะอยู่เหนือส่วนโค้ง

คุณสามารถดูการใช้งานแบบ faux ได้ใน shadertoy ที่นี่: https://www.shadertoy.com/view/4tj3Dy

สำหรับวิธีที่สองนี่เป็นวิธีการจาก Valve ซึ่งระยะทางไปยังรูปร่างถูกเก็บไว้ในพื้นผิวแทนที่จะเป็นข้อมูลพิกเซลช่วยให้สามารถวาดภาพเวกเตอร์กราฟิกโดยใช้การสุ่มตัวอย่างพื้นผิว การถอดรหัสนั้นง่ายมากมันสามารถใช้งานได้แม้กับฮาร์ดแวร์ที่ใช้งานตายตัวโดยใช้การทดสอบอัลฟ่าเท่านั้น! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

เพื่อให้คุณเข้าใจว่าเทคนิคที่สองนั้นทำงานได้ดีเพียงใดภาพหนวดขนาด 1024x768 นี้สร้างจากรูปภาพต้นฉบับ 64x32 ที่มีช่องสีเดียว! (aka 2KB ไม่มีการบีบอัด)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันยังเขียนบางสิ่งเกี่ยวกับมันในบล็อกของฉัน: http://blog.demofox.org/2014/06/30/distance-field-textures/

นี่คือตัวอย่างโค้ด OpenCL ที่จะแสดงว่ามันง่ายแค่ไหน:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

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


1
ดูเพิ่มเติมที่valvesoftware.com/publications/2007/ …
internets ทำจาก catz

ใช่นั่นเป็นเทคนิคที่ยอดเยี่ยมมากนั่นเป็นเทคนิคที่สองที่ฉันพูดถึงและฉันลิงก์ไปยัง pdf เดียวกันข้างต้นเช่นกัน
Alan Wolfe

ว้าวพลาดไปขอโทษด้วย
อินเตอร์เน็ตทำจาก catz

1
วิธีการแก้ปัญหาการปรับตัวสำหรับขอบป้องกันนามแฝงของเขตข้อมูลระยะทางที่สามารถพบได้ที่นี่: essentialmath.com/blog/?p=151
Jim Van Verth

8

อาจจะมี.

คำตอบทางเทคนิคน้อย:

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

ทางเทคนิคเพิ่มเติม:

โปรดทราบว่าหากคุณไม่ได้ใช้หนึ่งใน GPUs ล่าสุดและห้องสมุดสำหรับการวาดเส้นทางเวกเตอร์บน GPU แล้วมันเป็นพื้นผิวบิตแมปบิตทั้งหมดที่แสดงผลโดย GPU

ฉันจะพิจารณากรณีทั่วไปที่แสดงผลกราฟิกแบบเวกเตอร์กับพื้นผิว ที่นี่ประสิทธิภาพจะขึ้นอยู่กับ toolchain ของคุณไม่ว่าจะเป็นแอปพลิเคชันของคุณกำลังสร้างพื้นผิวจากสินทรัพย์เวกเตอร์หรือไม่และดูกราฟิกที่ระดับการซูมต่างๆหรือไม่ มีสองประเด็นที่เกี่ยวข้อง: ทรัพยากรและการสร้างพื้นผิว หากคุณเพียงแสดงกราฟิกในขนาดคงที่ฉันจะบอกว่าไม่มีความแตกต่างและบางที toolchain ของคุณสามารถแปลงสินทรัพย์เป็นกราฟิกบิตแมปก่อนรันไทม์ อย่างไรก็ตามหากมีการแสดงในขนาดต่างๆหรือในโลก 3 มิติคุณจะต้องมีการทำแผนที่พื้นผิวแบบ mip ซึ่งจะใช้หน่วยความจำมากขึ้น พวกเขาจะใช้หน่วยความจำจำนวนมากถ้าคุณต้องการเห็นความใกล้ชิดของพวกเขาด้วยพื้นผิวขนาดใหญ่กว่า

ฉันหวังว่านี่จะช่วยได้.


6

มีวิธีการเรนเดอร์กราฟิกเวกเตอร์สองสามวิธี ในฐานะที่เป็น TheBuzzSaw กล่าวถึง NVIDIA มีส่วนขยายที่สามารถสร้างเส้นทางทั่วไปได้ค่อนข้างเร็ว (แต่แน่นอนว่ามันใช้ได้กับ GPU ของ NVIDIA เท่านั้น) และ Alan Wolfe กล่าวถึงวิธีการพื้นผิวโดยนัย (ช่อง Loop-Blinn / ระยะทาง) ซึ่งกำหนดฟังก์ชั่นที่บอกว่าคุณอยู่ภายในหรือภายนอกรูปร่างและสีพิกเซลตามฟังก์ชั่นดังกล่าว อีกวิธีหนึ่งคือ stencil-and-cover ซึ่งคุณแสดงผลพา ธ ไปยังบัฟเฟอร์ stencil และใช้จำนวนคี่คู่เพื่อกำหนดว่าพา ธ ครอบคลุมพิกเซลหรือไม่

โดยทั่วไปแล้วอย่างไรก็ตามข้อเสียคือการเรนเดอร์แรสเตอร์จะเร็วกว่า แต่จะไวกว่าการใช้นามแฝง เส้นทางการแสดงผลต้องใช้การตั้งค่าจำนวนมาก แต่ในทางทฤษฎีสามารถปรับขนาดให้เหมาะกับความละเอียดใด ๆ

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