คำถามติดแท็ก glsl

GLSL เป็นภาษาแรเงา OpenGL ใช้แท็กนี้สำหรับคำถามที่เกี่ยวกับเฉดสีที่เขียนในภาษานี้โดยเฉพาะ สำหรับคำถามทั่วไปเกี่ยวกับ shader ให้ใช้ [shader] แทน

6
ฉันจะแก้ไขข้อบกพร่อง GLSL ได้อย่างไร
เมื่อเขียนเฉดที่ไม่สำคัญ (เช่นเดียวกับเมื่อเขียนโค้ดอื่นที่ไม่ใช่เรื่องไร้สาระ) ผู้คนทำผิดพลาด [อ้างอิงที่จำเป็น]อย่างไรก็ตามฉันไม่สามารถแก้จุดบกพร่องเช่นเดียวกับรหัสอื่น ๆ - คุณไม่สามารถแนบ gdb หรือดีบักเกอร์ Visual Studio หลังจากทั้งหมด คุณไม่สามารถทำการดีบัก printf ได้เนื่องจากไม่มีรูปแบบเอาต์พุตคอนโซล สิ่งที่ฉันมักจะทำคือการแสดงข้อมูลที่ฉันต้องการดูเป็นสี แต่นั่นเป็นวิธีแก้ปัญหาขั้นพื้นฐานและชำนาญ ฉันแน่ใจว่าผู้คนจะคิดวิธีแก้ปัญหาที่ดีกว่า ดังนั้นฉันจะแก้ไขข้อบกพร่องของ shader ได้อย่างไร มีวิธีก้าวผ่านตัว Shader หรือไม่? ฉันสามารถดูการดำเนินการของ shader บนจุดสุดยอด / ดั้งเดิม / ชิ้นส่วนที่เฉพาะเจาะจงได้หรือไม่ (คำถามนี้เกี่ยวกับวิธีการดีบักโค้ด shader โดยเฉพาะคล้ายกับวิธีที่จะดีบั๊กโค้ด "ปกติ" ไม่ใช่เกี่ยวกับการดีบักสิ่งต่าง ๆ เช่นการเปลี่ยนแปลงสถานะ)
45 opengl  glsl  debugging 

4
การแชร์รหัสระหว่าง GLSL หลายตัว
ฉันมักจะพบว่าตัวเองคัดลอกรหัสวางระหว่างหลายเฉดสี ซึ่งรวมถึงการคำนวณหรือข้อมูลบางอย่างที่ใช้ร่วมกันระหว่างเฉดสีทั้งหมดในไปป์ไลน์เดียวและการคำนวณทั่วไปที่ยอดสุดยอดทั้งหมดของฉันต้องการ (หรือขั้นตอนอื่นใด) แน่นอนว่าเป็นวิธีปฏิบัติที่น่ากลัว: ถ้าฉันต้องการเปลี่ยนรหัสที่ใดก็ได้ฉันต้องตรวจสอบให้แน่ใจว่าฉันเปลี่ยนทุกที่อื่น มีวิธีปฏิบัติที่ดีที่สุดที่ได้รับการยอมรับในการรักษาDRYหรือไม่? ผู้คนแค่เติมไฟล์ร่วมกันเพียงไฟล์เดียวให้กับผู้ที่ต้องการซื้อของพวกเขาทั้งหมดหรือไม่? พวกเขาเขียน preprocessor C-style พื้นฐานของตัวเองซึ่งแยก#includeคำสั่งหรือไม่? หากมีรูปแบบที่ยอมรับในอุตสาหกรรมฉันต้องการติดตามพวกเขา
30 glsl 

1
ทำไมเสียงเพอร์ลินของฉันจึงดู“ บล็อก”?
ฉันพยายามใช้ Perlin Noise ด้วยตัวเองโดยใช้เพียงทฤษฎี (ติดตาม flafla2.github.io/2014/08/09/perlinnoise.html) น่าเสียดายที่ฉันไม่สามารถมองหาเสียงเพอร์ลิน "ดั้งเดิม" ได้ อะไรคือสาเหตุที่รหัสด้านล่างแสดงผล Perlin Noise รุ่นที่บล็อก ฉันควรปรับปรุง / เปลี่ยนแปลงรหัสเพื่อให้แสดงผล Perlin Noise โดยไม่มีสิ่งประดิษฐ์หรือไม่ ฉันสงสัยว่าอาจมีปัญหาไม่ว่าจะเป็นวิธีการสอดแทรกหรือในgradsเวกเตอร์ gradsเวกเตอร์มีผลคูณจุดของ (เวกเตอร์สุ่มสำหรับจุดตาข่าย) และ (เวกเตอร์ขนาด) - ทั้ง 4 จุดขัดแตะอยู่บริเวณใกล้เคียง (เวกเตอร์สุ่มและขนาดอธิบายไว้ในลิงค์แรก) GLSL Sandbox: http://glslsandbox.com/e#32663.0 float fade(float t) { return t * t * t * (t * (t * 6. - 15.) …
21 glsl  noise  artifacts 

1
สับสนกับการใช้งาน PBR
ฉันค้นพบโลกมหัศจรรย์ของคณิตศาสตร์และฉันกำลังชนกำแพงขนาดใหญ่ที่มี PBR และตั้งชื่อดังนั้นฉันจึงมีคำถามสองสามข้อ: เท่าที่ฉันเข้าใจ BRDF จะอธิบายว่าวัสดุตอบสนองต่อแสงอย่างไร (แสงเข้าและสะท้อนโดยตรง) แต่ใน "Cook-Torrance" ฉันไม่เห็นอะไรเลยเกี่ยวกับการสะท้อนฉันไม่เข้าใจว่าฉันรวมเข้ากับมันอย่างไรฉันจึงได้รับแสงและการสะท้อนแสงแบบกระจายเท่านั้น ฉันได้อ่าน "คำกระจาย" ที่แตกต่างกันมากมายเช่น "โอเรน - นายาร์" มันเป็นส่วนหนึ่งของ Cook-Torrance เหมือน "D" ที่แตกต่างกันในผู้เสนอชื่อ DFG หรือไม่ มันจะแทนที่โดยไม่ต้องคำนวณ specular? ฉันอ่านมากเกี่ยวกับ "GGX" จากพื้นหลังศิลปินปั่นฉันคิดว่ามันเป็นสิ่งที่ทำให้ภาพสะท้อนพร่ามัว แต่ดูเหมือนว่าฉันผิดและตอนนี้ฉันพบคำศัพท์ GGX ในสถานการณ์ที่แตกต่างกันมากมายเช่นใน micro-facet ปกติ การกระจายในบทช่วยสอนนี้ คำถามสั้น ๆ ก็คือ: "Oren-Nayar" และ "GGX" และ "Cook-Torrance" เกี่ยวข้องกันอย่างไร (ถ้าเป็น) และฉันจะรวม "การสะท้อน vec3" ในอัลกอริทึมเหล่านั้นได้อย่างไร อย่างที่ฉันพูดก่อนที่ฉันจะเป็นมือใหม่ในวิชาคณิตศาสตร์ดังนั้นหากคำตอบของคุณคือ "คณิตศาสตร์หนัก" …
14 glsl  pbr 

1
เมื่อใดจึงจะปิดใช้งานการแก้ไขมุมมองที่ถูกต้อง (ไม่มีตัวเลือก)
ใน GLSL มุมมองการแก้ไขที่ถูกต้องของยอดแอตทริบิวต์เป็นค่าเริ่มต้น - หนึ่งสามารถปิดการใช้งานที่เฉพาะเจาะจงสำหรับจุดสุดยอดแอตทริบิวต์โดยใช้noperspectiveรอบคัดเลือก นอกเหนือจากการใช้โพสต์โปรเซสซิ่งฉันไม่เคยเห็นมุมมองการแก้ไขที่ถูกต้องถูกปิดใช้งาน - มีกรณีการใช้งานอื่นอีกหรือไม่? นอกจากนี้มันยังสร้างความแตกต่างให้เกิดประสิทธิภาพ

1
ประสิทธิภาพการวนซ้ำในเครื่อง Shader
ฉันสงสัยว่าอะไรคือวิธีที่ดีที่สุดในการรวมฟังก์ชั่นวนลูปแบบไดนามิกเข้ากับ shader? ครั้งแรกดูเหมือนว่าไม่สามารถใช้อาร์เรย์แบบไดนามิกได้ ดังนั้นจะดีกว่าหรือไม่ที่จะสร้างอาร์เรย์ขนาดสูงสุดและเติมเพียงบางส่วนหรือกำหนดอาร์เรย์ด้วยขนาดที่กำหนดไว้ล่วงหน้า แล้ววิธีที่ดีที่สุดในการทำซ้ำแถวลำดับนี้คืออะไร ควรใช้ลูปที่ไม่ได้ควบคุมหรือลูปไดนามิกสำหรับบางอย่างระหว่างการทำซ้ำ 4 ถึง 128 หรือไม่ if (i == myCurrentMaximumIterationNumber)ผมเคยเห็นยังว่ามันเป็นไปได้ที่จะคายมันจำนวนสูงสุดที่กำหนดไว้ล่วงหน้าซ้ำแล้วหยุดมันด้วยสภาพเช่น

1
ฉันจำเป็นต้องแต่งเครื่องแบบหรือคุณลักษณะใหม่เมื่อเปลี่ยนโปรแกรม shader หรือไม่
การแสดงฉากมักจะเกี่ยวข้องกับโปรแกรม shader มากกว่าหนึ่งโปรแกรมซึ่งในกรณีของฉันทุกคนใช้คุณลักษณะเดียวกันและใช้เครื่องแบบอย่างน้อยบางส่วน เพื่อให้ทำงานอย่างถูกต้องฉันกำลังเล่นอย่างปลอดภัยซึ่งหมายความว่าฉันเชื่อมโยงคุณลักษณะใหม่และรับตำแหน่งเครื่องแบบที่เหมาะสมทุกครั้งที่ฉันสลับระหว่างโปรแกรม Shader ดังนั้นโดยทั่วไปหลายครั้งในทุก ๆ เฟรมซึ่งอาจไม่ใช่วิธีที่ดีที่สุด ดังนั้นจำเป็นต้องรีบูทคุณลักษณะและชุดเครื่องแบบใหม่หลังจากเปลี่ยนโปรแกรม shader หรือไม่? และทำไม? ถ้าเป็นเช่นนั้นมีวิธีการทำเช่นนี้หนึ่งครั้งในช่วงเริ่มต้นของโปรแกรมและไม่ต้องแตะอีกครั้ง (ยกเว้นการตั้งค่าเครื่องแบบ)?
11 opengl  glsl  shader 

1
เหตุใดการเข้าถึงพื้นผิวจึงช้าลงมากเมื่อคำนวณพิกัดพื้นผิวในส่วนของส่วน
เมื่อใช้พื้นผิวใน GLSL วิธีที่ดีที่สุดคือการคำนวณพิกัดพื้นผิวสุดท้ายใน shader ที่จุดสุดยอดและส่งให้กับ shader ของชิ้นส่วนโดยใช้varyings ตัวอย่างที่มีการพลิกง่าย ๆ ในพิกัด y: // Vertex shader attribute vec2 texture; varying highp vec2 texCoord; // ... void main() { texCoord = vec2(texture.x, 1.0-texture.y); // ... } // Fragment shader varying highp vec2 textureCoordinates; uniform sampler2D tex; // ... void main() { highp vec4 …

1
ปัญหาการแมปเงาของ WebGL รอบทิศทาง
ก่อนอื่นฉันอยากจะบอกว่าฉันได้อ่านบทความมากมายเกี่ยวกับการทำแผนที่เงาโดยใช้แผนที่ความลึกและ cubemaps และฉันเข้าใจว่ามันทำงานอย่างไรและฉันมีประสบการณ์การทำงานกับพวกเขาด้วยการใช้ OpenGL แต่ฉันมีปัญหาในการใช้งาน เทคนิคการทำแผนที่เงารอบทิศทางโดยใช้แหล่งกำเนิดแสงจุดเดียวในเครื่องมือกราฟิก 3 มิติของฉันชื่อ "EZ3" เอ็นจิ้นของฉันใช้ WebGL เป็น API กราฟิก 3D และ JavaScript เป็นภาษาการเขียนโปรแกรมสำหรับวิทยานิพนธ์ปริญญาตรีสาขาวิทยาศาสตร์คอมพิวเตอร์ โดยทั่วไปนี่คือวิธีที่ฉันใช้อัลกอริทึมการแมปเงาของฉัน แต่ฉันจะเน้นเฉพาะกรณีไฟจุดเพราะพวกเขาสามารถเก็บการแมปเงารอบทิศทาง ครั้งแรกที่ฉันใช้งานการเลือกสรรด้านหน้าแบบนี้: if (this.state.faceCulling !== Material.FRONT) { if (this.state.faceCulling === Material.NONE) gl.enable(gl.CULL_FACE); gl.cullFace(gl.FRONT); this.state.faceCulling = Material.FRONT; } ประการที่สองฉันสร้างโปรแกรมความลึกเพื่อบันทึกค่าความลึกสำหรับใบหน้า cubemap แต่ละอันนี่คือรหัสโปรแกรมความลึกของฉันใน GLSL 1.0: Vertex Shader: precision highp float; attribute vec3 position; uniform …

1
พยายามใช้ Microfacet BRDF แต่ภาพผลลัพธ์ของฉันไม่ถูกต้อง
ฉันกำลังพยายามใช้โมเดล BRDF ของ microfacet ฉันอ่านสไลด์ Sebastien Lagarde ของ ฉันใช้สูตรกับรหัสของฉัน แต่ฉันคิดว่าภาพผลลัพธ์ไม่ถูกต้อง สีเหลืองเป็นสีฐานของวัสดุ สีของ specular เป็นสีแดงเพื่อดูอย่างถูกต้อง รหัสของฉัน: // Fragment Shader #version 330 core in vec3 Position; in vec2 TexCoord0; in vec3 Normal; in vec3 Tangent; out vec4 FinalColor; uniform vec3 uCameraPosition; // init value: vec3(0, 0, 5) #define PI 3.1415926f #define EPSILON …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.