บางครั้งฉันใช้กราฟิกแบบเวกเตอร์เพียงเพราะพวกเขาดูดีกว่าเล็กน้อยในบางกรณีและบางครั้งฉันก็ใช้กราฟิกบิตแมป / แรสเตอร์
ฉันสงสัยว่ามีตัวเลือกประสิทธิภาพแตกต่างกันระหว่างสองตัวเลือกเหล่านี้หรือไม่
บางครั้งฉันใช้กราฟิกแบบเวกเตอร์เพียงเพราะพวกเขาดูดีกว่าเล็กน้อยในบางกรณีและบางครั้งฉันก็ใช้กราฟิกบิตแมป / แรสเตอร์
ฉันสงสัยว่ามีตัวเลือกประสิทธิภาพแตกต่างกันระหว่างสองตัวเลือกเหล่านี้หรือไม่
คำตอบ:
ดังที่ 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);
เทคนิคทั้งสองนี้เร็วมากและทำให้เส้นแบ่งระหว่างเวกเตอร์และกราฟิกแรสเตอร์เล็กน้อย พวกเขาจะแสดงผลโดยใช้เทคนิคการแรสเตอร์ แต่มีคุณสมบัติการซูม / การปรับขนาดเช่นเทคนิคกราฟิกแบบเวกเตอร์
อาจจะมี.
คำตอบทางเทคนิคน้อย:
หากคุณกำลังสร้างเว็บไซต์หรือแอปพลิเคชันอื่นซึ่งคุณไม่มีส่วนเกี่ยวข้องกับการเขียนโปรแกรมกราฟิกคำตอบก็น่าจะใช่ API พื้นฐานจะพยายามเดาวิธีการแสดงผลและแคชอย่างมีประสิทธิภาพ อย่างไรก็ตามในขณะที่แอปพลิเคชันของคุณทำงานและบางครั้ง API คาดเดาไม่ถูกต้องอาจต้องแสดงผลอีกครั้งและส่งผลต่อประสิทธิภาพ
ทางเทคนิคเพิ่มเติม:
โปรดทราบว่าหากคุณไม่ได้ใช้หนึ่งใน GPUs ล่าสุดและห้องสมุดสำหรับการวาดเส้นทางเวกเตอร์บน GPU แล้วมันเป็นพื้นผิวบิตแมปบิตทั้งหมดที่แสดงผลโดย GPU
ฉันจะพิจารณากรณีทั่วไปที่แสดงผลกราฟิกแบบเวกเตอร์กับพื้นผิว ที่นี่ประสิทธิภาพจะขึ้นอยู่กับ toolchain ของคุณไม่ว่าจะเป็นแอปพลิเคชันของคุณกำลังสร้างพื้นผิวจากสินทรัพย์เวกเตอร์หรือไม่และดูกราฟิกที่ระดับการซูมต่างๆหรือไม่ มีสองประเด็นที่เกี่ยวข้อง: ทรัพยากรและการสร้างพื้นผิว หากคุณเพียงแสดงกราฟิกในขนาดคงที่ฉันจะบอกว่าไม่มีความแตกต่างและบางที toolchain ของคุณสามารถแปลงสินทรัพย์เป็นกราฟิกบิตแมปก่อนรันไทม์ อย่างไรก็ตามหากมีการแสดงในขนาดต่างๆหรือในโลก 3 มิติคุณจะต้องมีการทำแผนที่พื้นผิวแบบ mip ซึ่งจะใช้หน่วยความจำมากขึ้น พวกเขาจะใช้หน่วยความจำจำนวนมากถ้าคุณต้องการเห็นความใกล้ชิดของพวกเขาด้วยพื้นผิวขนาดใหญ่กว่า
ฉันหวังว่านี่จะช่วยได้.
มีวิธีการเรนเดอร์กราฟิกเวกเตอร์สองสามวิธี ในฐานะที่เป็น TheBuzzSaw กล่าวถึง NVIDIA มีส่วนขยายที่สามารถสร้างเส้นทางทั่วไปได้ค่อนข้างเร็ว (แต่แน่นอนว่ามันใช้ได้กับ GPU ของ NVIDIA เท่านั้น) และ Alan Wolfe กล่าวถึงวิธีการพื้นผิวโดยนัย (ช่อง Loop-Blinn / ระยะทาง) ซึ่งกำหนดฟังก์ชั่นที่บอกว่าคุณอยู่ภายในหรือภายนอกรูปร่างและสีพิกเซลตามฟังก์ชั่นดังกล่าว อีกวิธีหนึ่งคือ stencil-and-cover ซึ่งคุณแสดงผลพา ธ ไปยังบัฟเฟอร์ stencil และใช้จำนวนคี่คู่เพื่อกำหนดว่าพา ธ ครอบคลุมพิกเซลหรือไม่
โดยทั่วไปแล้วอย่างไรก็ตามข้อเสียคือการเรนเดอร์แรสเตอร์จะเร็วกว่า แต่จะไวกว่าการใช้นามแฝง เส้นทางการแสดงผลต้องใช้การตั้งค่าจำนวนมาก แต่ในทางทฤษฎีสามารถปรับขนาดให้เหมาะกับความละเอียดใด ๆ