OpenGL: ที่ไหนที่ฉันใส่ shoud อยู่ที่ไหน


17

ฉันพยายามเรียนรู้ OpenGL ES 2.0 และฉันสงสัยว่าอะไรคือวิธีปฏิบัติที่ใช้กันทั่วไปมากที่สุดในการ "จัดการ" เฉดสี
ฉันถามคำถามนี้เพราะในตัวอย่างที่ฉันพบ (เช่นที่รวมอยู่ในการสาธิต API ที่มาพร้อมกับ android sdk) ฉันมักจะเห็นทุกอย่างในชั้นเรียน GLRenderer และฉันค่อนข้างแยกสิ่งต่าง ๆ เพื่อที่ฉันจะได้ ตัวอย่างเช่นวัตถุ GLImage ที่ฉันสามารถนำกลับมาใช้ใหม่เมื่อใดก็ตามที่ฉันต้องการวาดรูปสี่เหลี่ยมพื้นผิว (ฉันกำลังมุ่งเน้นไปที่ 2D เท่านั้นในขณะนี้) เช่นเดียวกับที่ฉันมีในรหัส OpenGL ES 1.0 ของฉัน ในเกือบทุกตัวอย่างที่ฉันพบ shaders ถูกกำหนดให้เป็นคุณลักษณะของคลาส ตัวอย่างเช่น:

public class Square {

public final String vertexShader =
        "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec4 aColor;\n" +
        "varying vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vColor = aColor;\n" +
        "}\n";

public final String fragmentShader =
        "precision mediump float;\n" +
        "varying vec4 vColor;\n" +
        "void main() {\n" +
        "  gl_FragColor = vColor;\n" +
        "}\n";
// ...
}

ฉันต้องขออภัยล่วงหน้าหากคำถามเหล่านี้บางคำถามเป็นใบ้ แต่ฉันไม่เคยทำงานร่วมกับผู้คนมาก่อน

1) โค้ดด้านบนเป็นวิธีทั่วไปในการกำหนดเฉดสี (คุณสมบัติของคลาสสุดท้ายสาธารณะ) หรือไม่
2) ฉันควรมีคลาส Shader แยกจากกันหรือไม่
3) ถ้ามีการกำหนดเฉดสีไว้นอกคลาสที่ใช้พวกมันฉันจะรู้ชื่อของคุณลักษณะของพวกมันได้อย่างไร (เช่น "aColor" ในส่วนของรหัสต่อไป) เพื่อให้สามารถโยงมันได้

colorHandle = GLES20.glGetAttribLocation(program, "aColor");

คำตอบ:


16

ฉันไม่ชอบวิธีการกำหนดเฉดสี (ในสตริง) เสมอ ฉันชอบที่จะทำของฉันในไฟล์ข้อความและอ่านมันเมื่อโหลด การกำหนดในสตริงนั้นน่ารำคาญสำหรับการดีบั๊กและมันก็ดูยุ่งเหยิงสำหรับฉัน มันง่ายกว่ามากที่จะพิมพ์มันออกมาและดูมันในรูปแบบที่ควรจะเป็นแทนที่จะเป็นสตริง

ฉันยังมีคลาสแยกต่างหากที่มีฟังก์ชั่น shader ทั่วไปเช่นการอ่านใน shaders และการพิมพ์ข้อมูลการบันทึกสำหรับการดีบัก shader

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

อย่างไรก็ตามในที่สุดมันก็ขึ้นอยู่กับคุณ วิธีที่คุณทำอยู่ตอนนี้มันใช้งานได้ดีถ้ามันไม่ทำให้คุณมีปัญหา


2
การมีเฉดสีของคุณในไฟล์แยกต่างหากก็หมายความว่าคุณสามารถใช้เครื่องมือแก้ไขแบบพกพาที่มีประโยชน์และมีการเน้นไวยากรณ์แบบเต็มและแม้แต่ดูตัวอย่างก่อนที่จะทดสอบในโปรแกรมของคุณหากคุณรองรับสิ่งนั้น
Raceimaztion

6
เหตุผลที่แท้จริงเพียงอย่างเดียวสำหรับการมีเฉดสีในสตริงคือสำหรับการทดสอบและบทช่วยสอนอย่างรวดเร็ว .. ซึ่งการจัดการไฟล์จะเพิ่ม "รหัสที่ไม่จำเป็น" จำนวนมาก
Jari Komppa

2
นอกจากนี้คุณยังสามารถนำไฟล์ hot-reload ไปใช้กับ shader ซึ่งช่วยให้คุณสามารถดีบักการเปลี่ยนแปลงโดยไม่ต้องเปิดเกมใหม่ ผลผลิต ++
Liosan

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

8

การจัดการ Shader (และเนื้อหา) นั้นเป็นปัญหาที่ค่อนข้างยุ่งยากเมื่อคุณพบว่าระบบกราฟิกของคุณมีความซับซ้อนมากขึ้นและคุณสังเกตว่าการเข้ารหัสอย่างหนักทุก shader จะนำไปสู่การทำซ้ำรหัสจำนวนมาก นี่คือวิธีการทางเลือกอื่น ๆ ในการแก้ไข:

  • ตัวอย่างเล็ก ๆ ที่มีเพียง shaders สองสามคนมักจะเขียนโค้ดเป็นสตริงเพื่อหลีกเลี่ยงการจัดการไฟล์ตามที่ Jari Komppa แสดงความคิดเห็น
  • ดีกว่าคือการใช้ไฟล์แยกที่คุณสามารถเน้นไวยากรณ์และการจัดรูปแบบที่เหมาะสม นอกจากนี้คุณยังสามารถเขียนรหัสระบบ debug อย่างง่าย ๆ ที่คอยเฝ้าดูการเปลี่ยนแปลงในไฟล์เหล่านั้นและปรับใช้ shader ที่แก้ไขได้ทันทีขณะที่เกมกำลังทำงาน
  • เมื่อจำนวนวัสดุเพิ่มขึ้นเครื่องปั่นเงาจะกลายเป็นสิ่งจำเป็น โดยทั่วไปคุณจะกำหนดตัวอย่างข้อมูลทั่วไปเช่น "ส่วนย่อยของการทำแผนที่ตัวอย่างปกติ" และเขียนเฉดที่สมบูรณ์ของคุณโดยการรวมส่วนประกอบที่ต้องการ
    • คุณสามารถใช้ส่วนย่อยของสตริงที่เข้ารหัสยาก แต่มันก็ยุ่งอย่างรวดเร็วดังนั้นไฟล์อีกครั้งเป็นความคิดที่ดี
    • คุณสามารถมีบิตของรหัสในไฟล์แยกต่างหาก (หรือเหมือนกัน) หรือใช้ubershader / supershaderที่คุณใช้ preprocessor (หรือแฟล็กชุดรูปแบบ) เพื่อเปิดใช้งาน / ปิดใช้งานสิ่งต่าง ๆ

สำหรับคุณสมบัติและชื่อชุดและเช่นนั้นคุณเพียงแค่ใช้การตั้งชื่อที่สอดคล้องกันในทุกเฉดสี


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