การสุ่มตัวอย่างพื้นผิว Direct3D ช้ามาก


9

ดังนั้นฉันจึงเขียนเกมเล็ก ๆ โดยใช้ Direct3D 9 และฉันใช้การทำงานหลายอย่างเพื่อภูมิประเทศ สิ่งที่ฉันทำคือการสุ่มตัวอย่าง 3 พื้นผิวและแผนที่ผสมและรับสีโดยรวมจากพื้นผิวทั้งสามตามช่องสีจากแผนที่ผสมผสาน อย่างไรก็ตามฉันได้รับอัตราเฟรมลดลงมากเมื่อฉันลองมากกว่า 1 พื้นผิวฉันจะเปลี่ยนจาก 120+ fps เป็นต่ำกว่า 50

นี่คือรหัส HLSL ที่รับผิดชอบในการชะลอตัว:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

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

ขอบคุณ


คุณมีฮาร์ดแวร์อะไร สี่ตัวอย่างพื้นผิวไม่ควรมีปัญหากับฮาร์ดแวร์ใหม่ใด ๆ
Axel Gneiting

ฉันมี Radeon X1950 ใช่แล้วมันมีอายุสองปีถ้าไม่มาก ฉันเดาว่ามันอาจจะไม่ใช่ฮาร์ดแวร์ที่ดีที่สุด คุณคิดอย่างไร ?
dotminic

คำตอบ:


9

หากคุณต้องการเร่งความเร็วสิ่งต่างๆคุณสามารถใช้สิ่งที่เรียกว่าแผนที่พื้นผิว

Wikipedia - แผนที่พื้นผิวเป็นภาพขนาดใหญ่หรือ "แผนที่" ซึ่งมีภาพย่อยขนาดเล็กจำนวนมากแต่ละภาพเป็นพื้นผิวสำหรับบางส่วนของวัตถุ 3 มิติ sub-textures สามารถเรนเดอร์ได้โดยการแก้ไขพิกัดพื้นผิวของ uvmap ของวัตถุบนแผนที่โดยบอกว่าส่วนใดของภาพพื้นผิวของมันในแอปพลิเคชั่นที่มีการใช้พื้นผิวขนาดเล็กจำนวนมากบ่อยครั้ง เก็บพื้นผิวในพื้นผิวแผนที่ซึ่งถือว่าเป็นหน่วยโดยฮาร์ดแวร์กราฟิก

มีประสิทธิภาพมากขึ้นสำหรับ GPU ในการสุ่มตัวอย่างภาพพื้นผิวขนาดใหญ่ 4 ครั้งเปรียบเทียบกับภาพตัวอย่าง 4 ภาพแต่ละภาพ นี่คือตัวอย่างของแผนที่พื้นผิวภูมิประเทศ

ข้อความแสดงแทน


1
ขอบคุณสำหรับคำแนะนำฉันใช้ shader ของฉันโดยใช้แผนที่พื้นผิวฉัน "เพียงแค่" ได้รับ 109fps ในขณะนี้ แต่เป็นการปรับปรุงอย่างเป็นระเบียบจาก 55fps ที่ฉันได้รับ ขอบคุณ!
dotminic

1
+1 สำหรับคำตอบที่ดี ฉันขอถามว่าคุณได้ภาพพื้นผิวแผนที่นั้นมาจากไหน มันเป็นกรรมสิทธิ์หรือฟรีสำหรับการใช้งานใด ๆ
คาเมรอน

4

สิ่งที่ต้องพิจารณาอีกประการหนึ่งคือรูปแบบพื้นผิว มันเป็นพื้นผิวดิบ 32bpp หรือไม่ หากเป็นเช่นนั้นให้พิจารณาใช้พื้นผิว DXT1 ที่ถูกบีบอัดซึ่งคือ 4 บิต / พิกเซล (ใช้พื้นที่ 1 / 8th) หรือ DXT5 หากคุณต้องการช่องอัลฟาที่ 8 บิต / พิกเซล

การลดขนาดของข้อมูลพื้นผิวควรส่งผลให้ความต้องการแบนด์วิดท์หน่วยความจำพื้นผิวลดลงและปรับปรุงประสิทธิภาพแคชพื้นผิว

ตรวจสอบด้วยว่าคุณไม่ได้ตั้งค่าตัวกรอง anisotropic ที่มีคุณภาพสูงสุดซึ่งสามารถเพิ่มค่าใช้จ่ายได้พอสมควร


ขอบคุณสำหรับคำแนะนำฉันจะลองอีกครั้ง
dotminic

3

พื้นผิวของคุณมี mipmaps ไหม?

การสุ่มตัวอย่างพื้นผิวอาจมีราคาแพงเป็นพิเศษ (โดยไม่มีการโหลดแคช)


ถ้าพื้นผิวมี mipmaps ฉันส่งออกเป็น * .dds จากเครื่องมือ DirectX texture แต่พวกเขาจะใช้พื้นผิวในเกมเชิงพาณิชย์ที่มีพื้นผิวที่มีความละเอียดสูงอยู่มากมายได้อย่างไร ฉันแค่สุ่มตัวอย่างแผนที่แบบสัมผัส 1 แผ่นและรับอัตราเฟรมที่ 109 เฟรมต่อวินาทีในขณะที่เรนเดอร์ภูมิประเทศทั้งหมดบน GPU
dotminic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.