การใช้ LUT เพื่อเพิ่มความเร็วในการเรียกใช้งานหนักสำหรับอุปกรณ์เคลื่อนที่


10

ฉันพยายามทำให้shader นี้ทำงานบน iDevice ที่เก่าแก่มากรวมถึง Android ในที่สุด

แม้ว่าฉันจะลดรหัสให้เหลือ 2 ฟังก์ชันไซน์ต่อชิ้นส่วน Shader ก็ทำงานที่ประมาณ 20fps

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

ใน shader ฉันเชื่อมโยงด้านบนฉันได้จำลองแล้วว่าการปัดเศษค่าที่ส่งไปยังฟังก์ชันตรีโกณมิติยิ่งปล่อยเมาส์ (ขณะลง) ให้คุณภาพของ shader ยิ่งน้อยลง จริงๆแล้วมันค่อนข้างเท่ห์เพราะอยู่ใกล้กับทางด้านซ้ายมันดูเหมือนแตกต่างอย่างสิ้นเชิงและเท่ห์มาก ๆ

อย่างไรก็ตามฉันมีสองประเด็นขัดแย้ง:

  1. ฉันไม่ทราบว่าวิธีที่มีประสิทธิภาพมากที่สุดในการมีอาร์เรย์ค่า 360 เช่นอะไรใน GLSL shader ค่าคงที่หรือสม่ำเสมอ?
  2. ฉันไม่สามารถหาวิธีใส่ตัวเลขในช่วงปกติได้ถ้าฉันต้องการมุมระหว่าง 0 ถึง 360 (ใช่ฉันรู้ว่า GPU ใช้เรเดียน) ฉันจะทำเช่นนั้น

    func range(float angle)
    {
       float temp = angle
       while (temp > 360) {temp -= 360;}
       while (temp < 0)   {temp += 360;}
       return temp;
    }
    

    อย่างไรก็ตาม GLSL ไม่อนุญาตในขณะที่ลูปหรือฟังก์ชั่นวนซ้ำ


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

5
เกี่ยวกับ # 2 modฟังก์ชันในตัวคือสิ่งที่คุณต้องการ mod(angle, 360.0)คุณจะเขียน
นาธานรีด

1
@trichoplax ความคิดที่ยอดเยี่ยม แต่ฉันไม่รู้ว่าคุณจะสามารถค้นหาค่าบนโต๊ะได้อย่างไร สมมติว่าเราวางพวกเขาในอาร์เรย์กับบางส่วนของพวกเขามีสมาธิมากขึ้น เราจะหาดัชนีที่ถูกต้องได้อย่างไร?
J.Doe

6
วิธีการเกี่ยวกับการใส่ค่าของคุณลงในพื้นผิว 1D 3-channel? ด้วยวิธีนี้คุณจะได้รับบาป cos และสีแทนสำหรับราคาของการค้นหาพื้นผิวเดียว หากคุณแมปมุม 0-2pi ถึง 0 - 1 UV และใช้โหมดพื้นผิวซ้ำที่คุณไม่ต้องการแม้แต่การเรียกใช้ mod มันจะ 'ตัด' โดยอัตโนมัติและคุณสามารถรับการประมาณเชิงเส้นที่กรองเชิงเส้นระหว่างค่าที่เก็บไว้ของคุณมากกว่า หักไปที่ที่ใกล้ที่สุด
russ

3
บ่อยครั้งที่คุณสามารถกำจัดฟังก์ชันตรีโกณมิติเมื่อใช้กับรูปทรงเรขาคณิตโดยไม่ใช้มุม แต่เริ่มต้นและสิ้นสุดด้วย sin / cos pair และใช้ ident ident สำหรับรูปครึ่งมุมและเช่นนั้น
วงล้อประหลาด

คำตอบ:


8

[0,360)[0,2π)

  • [0,360][0,1]
  • คุณจะได้รับประโยชน์เพิ่มเติมโดยไม่ต้องทำการปรับเปลี่ยนช่วงเวลาแบบลูปเหมือนของคุณ (แม้ว่าคุณจะไม่จำเป็นต้องวนซ้ำอยู่ดีและสามารถใช้การดำเนินการโมดูลัสก็ได้) เพียงใช้GL_REPEATเป็นโหมดการตัดคำสำหรับพื้นผิวและจะเริ่มต้นที่จุดเริ่มต้นอีกครั้งโดยอัตโนมัติเมื่อเข้าถึงด้วยอาร์กิวเมนต์> 1 (และคล้ายกันสำหรับอาร์กิวเมนต์ที่เป็นลบ)
  • และคุณยังได้รับประโยชน์จากการสอดแทรกเชิงเส้นตรงระหว่างค่าสองค่าในอาร์เรย์โดยทั่วไปฟรี (หรือสมมุติว่าเกือบฟรี) โดยใช้GL_LINEARเป็นตัวกรองพื้นผิววิธีการรับค่าที่คุณไม่ได้เก็บไว้นี้ แน่นอนการแก้ไขเชิงเส้นแน่นอนไม่ถูกต้อง 100% สำหรับฟังก์ชั่นตรีโกณมิติ แต่แน่นอนดีกว่าไม่มีการแก้ไข
  • คุณสามารถเก็บค่าได้มากกว่าหนึ่งค่าในพื้นผิวโดยใช้พื้นผิว RGBA (หรือส่วนประกอบหลายอย่างที่คุณต้องการ) วิธีนี้คุณจะได้รับเช่นบาปและ cos ด้วยการค้นหาพื้นผิวเดียว
  • [1,1][0,1]float sin = 2.0 * (texValue.r + texValue.g / 256.0) - 1.0;(หรือส่วนประกอบอื่น ๆ สำหรับเมล็ดละเอียดยิ่งขึ้น) สิ่งนี้จะช่วยให้คุณได้กำไรจากพื้นผิวที่มีหลายองค์ประกอบอีกครั้ง

แน่นอนว่ายังต้องมีการประเมินว่านี่เป็นวิธีแก้ปัญหาที่ดีกว่าเนื่องจากการเข้าถึงพื้นผิวไม่ได้ฟรีทั้งหมดรวมถึงขนาดและรูปแบบของการรวมกันที่ดีที่สุด

ในการเติมพื้นผิวด้วยข้อมูลและที่อยู่ของความคิดเห็นของคุณคุณต้องพิจารณาว่าการกรองพื้นผิวส่งกลับค่าที่แน่นอนที่ศูนย์เท็กเซลเช่นพื้นผิวประสานงานออกโดยขนาดเท็กเซลครึ่ง ใช่คุณควรสร้างค่าที่.5texelsนั่นคือสิ่งนี้ในรหัสแอปพลิเคชัน:

float texels[256];
for(unsigned int i = 0; i < 256; ++i)
    texels[i] = sin((i + .5f) / 256.f) * TWO_PI);
glTexImage1D(GL_TEXTURE_1D, 0, ..., 256, 0, GL_RED, GL_FLOAT, texels);

uniform float sinTable[361]glUniform1fv[0,360)mod

angle = mod(angle, 360.0);
float value = sinTable[int(((angle < 0.0) ? (angle + 360.0) : angle) + 0.5)];

1
นี่คือส่วนขยายที่น่าสนใจในการจัดเก็บตารางค้นหาในพื้นผิว มัน (ab) ใช้การแก้ไขพื้นผิว N เชิงเส้นเพื่อรับการแก้ไขคำสั่งที่สูงขึ้น (aka ดีกว่าเชิงเส้น) ของจุดข้อมูลพื้นผิวปริมาณและ hypervolumes blog.demofox.org/2016/02/22/…
Alan Wolfe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.