คำหลักเข้า / ออกใน GLSL


46

ฉันไม่เข้าใจวิธีใช้in/ outคีย์เวิร์ดใน GLSL และ google ก็ไม่ได้ช่วยอะไรมากมาย

พวกเขาทำอะไรกันแน่ ตัวอย่างเช่นฉันจะใช้มันได้อย่างไรถ้าฉันต้องการส่งชุดตัวแปรที่แตกต่างกันต่อยอดไปยังส่วนที่แตกต่างกัน?

แท้จริงทุกบทช่วยสอนที่ฉันพบใช้varying/ attributeคำหลักและนั่นไม่เป็นประโยชน์

คำตอบ:


65

รอบคัดเลือกการจัดเก็บinและoutจริงมีวัตถุประสงค์ที่มีและที่เหนือกว่าของและvarying attributeพวกเขากำหนดสิ่งที่ตัวแปรตามลำดับในการทำให้และออกทำให้สำหรับ Shader ดูหน้าบัตรอ้างอิง GLSL 4.2 :

  • in: เชื่อมโยงเข้าสู่ shader จากขั้นตอนก่อนหน้า
  • out: เชื่อมโยงออกจาก shader ไปยังขั้นตอนต่อไป
  • attribute: เช่นเดียวกับinShader ที่
  • varying: เช่นเดียวกับเวอร์outเท็กซ์เชดเดอร์เหมือนกับเฟรเดอร์inแชร์เดอร์(หมายเหตุ: สิ่งเหล่านี้พลิกไปมาอย่างผิด ๆ ในการ์ดอ้างอิงที่กล่าวถึงข้างต้น)

ด้วยหมายเหตุด้านข้างที่สองหลังเป็นประเภทที่เลิกใช้แล้ว: พวกเขาไม่ได้อยู่ในโปรไฟล์ 4.2 หลักเท่านั้นในโปรไฟล์ความเข้ากันได้


พวกเขาทำอะไรกันแน่

สำหรับการใช้งานให้ใช้จุดสุดยอด shader จากAn intro สู่ OpenGL ที่ทันสมัย บทที่ 2.2: Shaders :

#version 110

attribute vec2 position;    
varying vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

มันควรจะเขียนใหม่ใน 4.2 แกนเป็น:

#version 420

in vec2 position;    
out vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

บทเรียนที่ไม่ช่วยเหลือ

ฉันเดาเหตุผลหลักที่คุณพบรหัสการสอนที่ "ล้าสมัย" คือทุกคนไม่สามารถเข้าถึงฮาร์ดแวร์ที่เข้ากันได้กับ GLSL 3.3+ โดยไม่คำนึงถึงสำหรับการที่ดีและอื่น ๆ ถึงวันที่กวดวิชาที่ฉันยินดีจะชี้ให้คุณในทิศทางของโรล Bolas' การเขียนโปรแกรมการเรียนรู้ที่ทันสมัยกราฟิก 3D


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