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

สำหรับคำถามเกี่ยวกับการใช้ไลบรารีกราฟิก OpenGL

9
โปรแกรมเมอร์กราฟิกใหม่ควรเรียนรู้ Vulkan แทนที่จะเป็น OpenGL หรือไม่
จากวิกิ : "Vulkan API ถูกเรียกว่า 'การริเริ่ม OpenGL รุ่นต่อไป' โดย Khrono" และนั่นคือ "ความพยายามในการออกแบบใหม่โดยมีเหตุผลที่จะรวม OpenGL และ OpenGL ES ไว้ใน API ทั่วไปที่จะไม่ย้อนหลัง เข้ากันได้กับรุ่น OpenGL ที่มีอยู่ " ดังนั้นผู้ที่เข้าร่วมในการเขียนโปรแกรมกราฟิกควรจะได้รับบริการที่ดีกว่าในการเรียนรู้ Vulkan แทนที่จะเป็น OpenGL หรือไม่ ดูเหมือนว่าพวกเขาจะทำหน้าที่จุดประสงค์เดียวกัน
53 opengl  api  vulkan 

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

1
“ st” หมายถึงอะไรในบริบทของ OpenGL?
ฉันเคยเห็นคำนี้stมาสองสามครั้งเมื่อมองไปที่ชิ้นส่วน OpenGL อื่น ๆ อย่างไรก็ตามฉันไม่รู้ว่ามันหมายถึงอะไรหรือใช้เพื่ออะไร นี่คือตัวอย่าง: uniform vec2 u_resolution; vec2 st = gl_FragCoord.xy/u_resolution; ฉันสามารถเข้าใจได้ว่านี่เป็นการแปลงพิกัดพิกเซลเป็นพิกัดปกติที่ 0.0 - 1.0 แทนที่จะเป็น 640 x 480 (ตัวอย่าง) position.stผมเคยเห็นยังสิ่งที่ต้องการ มันหมายความว่าอะไร?
19 opengl 

2
แบนด์วิดธ์คืออะไรและทำงานอย่างไร
เอกสาร OpenGLระบุ returns the sum of the absolute value of derivatives in x and yfwidth นี่หมายถึงอะไรในศัพท์ทางคณิตศาสตร์ที่น้อยกว่าและมีวิธีในการมองเห็นภาพหรือไม่? จากความเข้าใจในฟังก์ชั่นของฉันฉันfwidth(p)สามารถเข้าถึงค่าเป็นpพิกเซลใกล้เคียง สิ่งนี้ทำงานกับ GPU โดยไม่ส่งผลกระทบต่อประสิทธิภาพอย่างมากและทำงานได้อย่างน่าเชื่อถือและสม่ำเสมอในทุกพิกเซล
18 opengl 

3
ฉันจะดีบักสิ่งที่แสดงผลกับ Frame Buffer Object ใน OpenGL ได้อย่างไร
ฉันมีคลาวด์จุดที่กำลังแสดงผลบนหน้าจอ แต่ละจุดมีตำแหน่งและสีรวมถึงรหัส ฉันถูกขอให้เรนเดอร์ ID สำหรับแต่ละจุดของพื้นผิวดังนั้นฉันจึงสร้าง FBO และแนบสองพื้นผิวหนึ่งสำหรับสีและหนึ่งสำหรับความลึก ฉันสร้าง VAO และ VBO ที่จำเป็นสำหรับการเรนเดอร์นอกจอและอัปโหลดตำแหน่งและ ID ของแต่ละจุด เมื่อทำการเรนเดอร์ไปยัง FBO เสร็จแล้วฉันอ่านพิกเซลของพื้นผิวสีด้วยglReadPixels()เพื่อดูว่าค่าคือglClearColor()อะไร มีวิธีที่ฉันสามารถดีบักสิ่งที่มันถูกแสดงกับพื้นผิวสีของ FBO ของฉัน? คำแนะนำใด ๆ ที่คุณอาจให้จะยินดีมาก
17 opengl  debugging 

1
มีวิธีใดบ้างที่จะสร้างสิ่งดั้งเดิมในรูปทรงเรขาคณิตที่ไม่มีเรขาคณิตอินพุตใด ๆ ?
ไม่กี่ปีที่ผ่านมาผมพยายามที่จะใช้นี้ GPU อัญมณีใน OpenGL ในการสร้างกระบวนการภูมิประเทศ 3 มิติโดยใช้วงก้อน บทความแนะนำให้ใช้ลูกบาศก์เดินในรูปทรงเรขาคณิตกับประสิทธิภาพสูงสุด นี่หมายความว่าฉันต้องเรียกใช้ shader หนึ่งครั้งสำหรับทุก voxel ในโดเมนและมันจะสร้างรูปทรงเรขาคณิตทั้งหมดในเซลล์นั้น ปัญหาอย่างหนึ่งที่ฉันสะดุดคือวิธีทำให้เรขาคณิตเชดเดอร์ทำงานโดยที่ไม่ต้องมีอะไรให้แสดงนอกตัวแปลงนั้น วิธีแก้ปัญหาของฉัน (ซึ่งดูค่อนข้างแฮ็ค) คือการสร้างจุดในแต่ละเซลล์ทิ้งมันด้วยเรขาคณิต shader และปล่อยสามเหลี่ยมของฉันแทน ฉันไม่เคยพบวิธีแก้ปัญหาที่เหมาะสมและวิธีแก้ปัญหานี้ยังคงอยู่ในรหัสสุดท้าย ดังนั้นมีบอกให้ OpenGL เพื่อเริ่มต้นการส่งผ่านการเรนเดอร์จาก shader เรขาคณิตโดยไม่มีเรขาคณิตอินพุตหรือไม่? หรือฉันจะต้องส่งจุดจำลองไปยัง GPU เพื่อให้ทำงานได้ตลอดเวลา

2
จะใช้ trackball ใน OpenGL ได้อย่างไร?
หลังจากอ่านมากเกี่ยวกับการแปลงมันถึงเวลาที่จะใช้ trackball สำหรับแอพของฉัน ฉันเข้าใจว่าฉันต้องสร้างเวกเตอร์จากจุดเริ่มต้นไปยังจุดที่คลิกเมาส์จากนั้นอีกอันจากจุดเริ่มต้นไปยังที่ที่ปล่อยเมาส์ คำถามของฉันคือฉันต้องเปลี่ยนพิกัดพิกเซล (x, y) เป็น coords โลกหรือฉันควรทำทุกอย่างในพื้นที่ภาพ (พิจารณาพื้นที่ภาพคือการฉายภาพ 2 มิติของฉากที่วัดเป็นพิกเซล) แก้ไข คำตอบของ Richie Sams นั้นดีมาก อย่างไรก็ตามฉันคิดว่าฉันกำลังทำตามวิธีที่แตกต่างกันเล็กน้อยโปรดแก้ไขฉันหากฉันผิดหรือเข้าใจผิดบางอย่าง ในใบสมัครของฉันฉันมีSimplePerspectiveCameraระดับที่ได้รับpositionของกล้องที่position of the targetเรากำลังมองหาที่upเวกเตอร์ที่fovy, aspectRatio, nearและfarระยะทาง กับสิ่งที่ฉันสร้างเมทริกซ์มุมมองและการฉายของฉัน ตอนนี้ถ้าฉันต้องการซูมเข้า / ออกฉันจะอัพเดทมุมมองและอัพเดทเมทริกซ์การฉายของฉัน ถ้าฉันต้องการเลื่อนฉันเลื่อนตำแหน่งของกล้องและดูที่เดลต้าที่เมาส์สร้าง ในที่สุดสำหรับการหมุนฉันสามารถใช้การแปลงแกนมุมหรือ quaternions สำหรับสิ่งนี้ฉันบันทึก pixel-coords ที่เมาส์ถูกกดแล้วเมื่อเมาส์เคลื่อนฉันก็จะบันทึก pixel-coords สำหรับแต่ละคู่ของคอร์ดฉันสามารถคำนวณค่า Z ที่กำหนดสูตรสำหรับทรงกลมเช่น sqrt (1-x ^ 2-y ^ 2) จากนั้นคำนวณเวกเตอร์ที่ไปจากtargetไปPointMousePressedและกลับจากtargetไปPointMouseMovedทำผลิตภัณฑ์ข้าม เพื่อให้แกนหมุนและใช้วิธีการใด ๆ เพื่อคำนวณตำแหน่งกล้องใหม่ อย่างไรก็ตามข้อสงสัยที่ใหญ่ที่สุดของฉันคือค่า …
15 opengl  trackball 

1
ความเข้ากันได้กับ OpenGL การตั้งชื่อแบบแผนและ ARB vs EXT
ฉันคิดว่าฉันได้สร้างความเข้าใจโดยทั่วไปเกี่ยวกับวิธีการตั้งชื่อการประชุมและส่วนขยายของ OpenGL จนกระทั่งฉันพบกรณีที่ทำให้ฉันสับสน นี่คือความเข้าใจของฉัน: ไม่มีคำต่อท้าย - glGenBuffers()เช่น ฟังก์ชั่นนี้เป็นส่วนหนึ่งของโปรไฟล์หลัก หน้าวิกิพีเดียบอกว่านี้ถูกบันทึกอยู่ในรายละเอียดหลักเริ่มต้นจากรุ่น 1.5 ARB - glGenBuffersARB()เช่น ฟังก์ชั่นนี้เป็นส่วนหนึ่งของGL_ARB_vertex_buffer_objectส่วนขยายมาตรฐาน ข้อมูลจำเพาะของส่วนขยายนี้อย่างชัดเจนประกาศGenBuffersARB()ในส่วน "วิธีการและฟังก์ชั่นใหม่" ส่วน "การพึ่งพา" บอกฉันว่าฉันสามารถเข้าถึงสิ่งนี้ได้จากบริบท 1.4+ หากฮาร์ดแวร์รองรับส่วนขยาย EXT - เป็นส่วนขยายและฟังก์ชั่นเฉพาะของผู้ขายที่มีเพียงผู้ขายบางรายเท่านั้นที่สามารถรองรับได้ วัตถุบัฟเฟอร์ Vertex ดูเหมือนไม่มีส่วนขยาย EXT ในรีจิสทรี นี่คือสิ่งที่ความเข้าใจของฉันพังลง: glGenFramebuffersตามที่วิกิแสดงให้เห็นถูกเพิ่มเข้าไปในแกนใน 3.0 ตอนนี้ฉันต้องการเข้าถึงฟีเจอร์บัฟเฟอร์เฟรมที่โปรไฟล์โปรไฟล์หลักที่ต่ำกว่า 3.0 ดังนั้นฉันต้องการใช้เป็นส่วนขยาย รีจิสทรีสเป็คบอกว่ามีสองส่วนขยายที่มีอยู่ - ARBและEXT คำถามที่ 1 - หากมีส่วนขยาย ARB อยู่ทำไมส่วนขยาย EXT จึงมีอยู่ คุณจะไม่เลือกอันที่เป็นมาตรฐานมากกว่าของผู้ขายเฉพาะหรือไม่? ดูข้อมูลจำเพาะ ARB ในส่วน …
14 opengl 

3
มีวิธีใดบ้างในการแสดงความโปร่งใสใน OpenGL
การผสมอัลฟ่าสามารถเปิดได้เพื่อให้พื้นผิวโปร่งใสเช่น: glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); แต่จะใช้งานได้ก็ต่อเมื่อแสดงวัตถุในลำดับหลังไปข้างหน้าเท่านั้น มิฉะนั้นสิ่งที่อยู่ในพื้นหลังจะปรากฏขึ้นด้านหน้าวัตถุที่ใกล้กว่าเช่นพื้นในภาพด้านล่าง สำหรับอนุภาคและองค์ประกอบ GUI การเรียงลำดับจะตกลง แต่สำหรับตาข่ายสามเหลี่ยมดูเหมือนว่ามันจะเป็นความพยายามมากเกินไปและช้าตามที่กล่าวไว้ที่นี่: https://www.opengl.org/wiki/Transparency_Sorting อะไรคือวิธีการทั่วไปในการจัดการกับสิ่งนี้? ฉันรู้ว่านี่ค่อนข้างกว้างและไม่ใช่รายละเอียดการใช้งานในเชิงลึกเพียงแค่คำอธิบายสั้น ๆ เกี่ยวกับวิธีการบางอย่างและสิ่งที่อาจเกี่ยวข้อง

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

1
การซิงโครไนซ์การเรียกใช้ OpenGL Compute Shader อย่างต่อเนื่อง
ฉันมีตัวประมวลผลสองตัวที่ต้องดำเนินการในลำดับที่แน่นอนและเอาต์พุตที่ขึ้นอยู่กับอินพุตก่อนหน้า เป็นการดีที่ฉันจะไม่ต้องคัดลอกบัฟเฟอร์ฝั่งไคลเอ็นต์และทำงานทั้งหมดของฉันบน GPU พิจารณาฉันมีสองเฉดสีประมวลรวบรวมและเชื่อมโยงเป็นและprogram_one program_twoสมมติว่าฉันยังมีGL_SHADER_STORAGE_BUFFERที่มีข้อมูลที่ถูกเขียนไปโดยและอ่านโดยprogram_one program_twoฉันสามารถทำสิ่งต่อไปนี้ได้ไหม: glUseProgram(program_one); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer); glDispatchCompute(16, 16, 1); glUseProgram(program_two); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer); glDispatchCompute(16, 16, 1); มันรับประกันได้หรือไม่ว่าการร้องขอทั้งหมดของ shader การคำนวณแรกจะเสร็จสิ้นก่อนที่จะมีการร้องขอที่สอง (เพื่อหลีกเลี่ยงการแย่งข้อมูลระหว่างการอ่านและการเขียนbuffer)? ถ้าไม่ฉันจะซิงโครไนซ์มันได้อย่างไร?

2
OpenGL - การตรวจจับขอบ
ฉันต้องการที่จะโหลดตาข่ายโดยพลการและวาดเส้นสีดำหนาตามขอบเพื่อให้ได้รูปเงาแบบตูน ฉันจัดการวาดเงาดำรอบ ๆ วัตถุโดยใช้ stencil buffer คุณสามารถดูผลลัพธ์ได้ที่นี่: แต่สิ่งที่ขาดหายไปคือเส้นสีดำในวัตถุนั้นเอง ฉันคิดเกี่ยวกับการตรวจสอบความไม่ต่อเนื่องตามปกติ: การตรวจสอบว่าพิกเซลข้างเคียงมีเวกเตอร์ปกติแตกต่างจากพิกเซลปัจจุบันหรือไม่ ถ้าใช่พบขอบแล้ว น่าเสียดายที่ฉันไม่รู้ว่าฉันจะใช้วิธีการนี้ได้อย่างไรทั้งใน OpenGL และใน GLSL เวอร์เท็กซ์ / ส่วนแยก ฉันยินดีเป็นอย่างยิ่งสำหรับความช่วยเหลือเกี่ยวกับวิธีการนี้หรือการตรวจจับขอบอื่น ๆ แก้ไข: ฉันไม่ได้ใช้พื้นผิวใด ๆ สำหรับตาข่ายของฉัน แม่นยำยิ่งกว่านี้ฉันต้องการสร้างโซลูชัน CAD / CAM ที่ดูมากที่สุดเช่นนี้ (นำมาจาก Top Solid https://www.youtube.com/watch?v=-qTJZtYUDB4 ):

1
"makeContextCurrent" ทำอะไรกันแน่
ฉันค่อนข้างสับสนเกี่ยวกับฟังก์ชั่นนั้น การอ้างอิงบริบท GLFWกล่าวว่า: ฟังก์ชันนี้ทำให้บริบท OpenGL หรือ OpenGL ES ของหน้าต่างที่ระบุเป็นปัจจุบันบนเธรดการโทร บริบทสามารถสร้างให้เป็นปัจจุบันได้ครั้งละหนึ่งเธรดและแต่ละเธรดสามารถมีบริบทปัจจุบันเพียงหนึ่งครั้งเท่านั้น แต่มันก็ไม่ได้ช่วยอะไรมาก มันสามารถทำงานได้เหมือนglBind-วิธีการหรือไม่? (glBindBuffer, glBindVertexArray และอื่น ๆ )
12 opengl  c++ 

2
GL_STATIC_DRAW กับ GL_DYNAMIC_DRAW เทียบกับ GL_STREAM_DRAW: มันมีความสำคัญหรือไม่
ใน OpenGL นั้นฟังก์ชั่นบัฟเฟอร์วัตถุ ( glBufferData, glBufferSubDataและอาจมีอีกสองสามคน) มีพารามิเตอร์usageอธิบายโดยเอกสารเป็นคำใบ้ของการใช้งานที่ตั้งใจอาจหมายถึงการช่วยให้การใช้งานมีประสิทธิภาพดีขึ้น การใช้ ระบุรูปแบบการใช้งานที่คาดหวังของแหล่งข้อมูล คงต้องเป็นสัญลักษณ์GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, หรือGL_DYNAMIC_READ การใช้ [... ] เป็นคำแนะนำในการนำ GL ไปใช้เพื่อให้สามารถเข้าถึงแหล่งเก็บข้อมูลของวัตถุบัฟเฟอร์ได้อย่างไร สิ่งนี้ช่วยให้การนำ GL ไปใช้ในการตัดสินใจอย่างชาญฉลาดยิ่งขึ้นซึ่งอาจส่งผลกระทบต่อประสิทธิภาพของวัตถุบัฟเฟอร์อย่างมาก อย่างไรก็ตามไม่ได้ จำกัด การใช้งานจริงของแหล่งข้อมูลGL_DYNAMIC_COPY wikiนั้นคลุมเครือในทำนองเดียวกัน: นี่เป็นเพียงคำใบ้เท่านั้น เป็นรหัส OpenGL ที่ถูกกฎหมายอย่างสมบูรณ์ในการปรับเปลี่ยนบัฟเฟอร์ STATIC หลังจากสร้างขึ้นหรือไม่เคยแก้ไขบัฟเฟอร์ STREAM [... ] เหล่านี้เป็นคำถามที่สามารถตอบได้ด้วยการทำโปรไฟล์อย่างระมัดระวัง และถึงแม้ว่าคำตอบนั้นจะถูกต้องสำหรับไดรเวอร์รุ่นนั้นโดยเฉพาะจากผู้จำหน่ายฮาร์ดแวร์รายนั้น ถ้าอย่างนั้นพารามิเตอร์นี้มีความเกี่ยวข้องกันอย่างไร? ผู้ขับขี่ต้องคำนึงถึงเรื่องนี้จริงหรือไม่และถ้าเป็นเช่นนั้นในประสบการณ์ของคุณจะมีผลกระทบกับการปฏิบัติจริงหรือไม่? คุณมีข้อมูลที่จะแบ่งปันหรือไม่? ฉันได้เขียนเลเยอร์ abstraction API กราฟิคบาง ๆ ไว้เพื่อใช้เป็น …

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

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