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

OpenGL เป็นมาตรฐานกราฟิกและ API ซึ่งกำหนดเป้าหมายไปยังตลาดเดสก์ท็อปและเวิร์กสเตชัน มันถูกออกแบบมาให้ง่ายต่อการเร่งความเร็วด้วยฮาร์ดแวร์คอมพิวเตอร์เฉพาะและการใช้งานส่วนใหญ่จึงให้ประสิทธิภาพที่ดีขึ้นอย่างมากเมื่อเทียบกับการแสดงผลซอฟต์แวร์แบบดั้งเดิม ปัจจุบัน OpenGL ใช้สำหรับแอพพลิเคชั่นเช่นซอฟต์แวร์ CAD และเกมคอมพิวเตอร์ นอกจากนี้ยังเป็นแพลตฟอร์มข้าม มาตรฐาน OpenGL ควบคุมโดยกลุ่ม Khronos ซึ่งควบคุม OpenGL ES ด้วย

1
การหมุนกล้อง 3D
ได้โปรดยกโทษให้ฉันด้วย แต่ฉันต้องการความช่วยเหลือและฉันติดอยู่กับเรื่องนี้มาสองสามสัปดาห์แล้วตอนนี้ฉันไม่มีความคืบหน้าและทุกที่ที่ฉันไปและฉันเห็นคำตอบที่ต่างออกไป ฉันมีเคล็ดลับและคำแนะนำเพียงพอตอนนี้ฉันแค่ต้องการใครสักคนที่จะให้คำตอบสำหรับฉันที่จะทำงานย้อนกลับจากเพราะฉันไม่เข้าใจ สิ่งที่ทำให้เรื่องนี้เกิดความสับสนมากที่สุดคือวิธีที่ทุกคนใช้ชุดของการประชุมหรือกฎระเบียบที่แตกต่างกันและคำตอบของพวกเขาขึ้นอยู่กับการประชุมของพวกเขาเอง ดังนั้นนี่คือชุดของการประชุมที่ฉันสร้างขึ้นตามสิ่งที่ดูเหมือนจะเป็นเรื่องธรรมดาและมีเหตุผลที่สุด: กฎมือขวาสำหรับแกน Positive Y เพิ่มขึ้น Positive Z กำลังเข้าหาผู้ชม Positive X อยู่ทางขวา Row Major matrixes, transposed เมื่อถูกส่งไปยังเฉดสี Pitch: การหมุนรอบแกน X Yaw: การหมุนรอบแกน y ม้วน: การหมุนเกี่ยวกับแกน z ลำดับการหมุน: หมุน, ระยะห่าง, Yaw (ถูกต้องไหมมีคนตรวจสอบฉันได้ไหม) ค่าการหมุนในเชิงบวกมองลงมาจากปลายบวกของแกนผลลัพธ์ในการหมุนตามเข็มนาฬิกา ทิศทางเริ่มต้นสำหรับการหมุน 0 ในทุกแกนคือเวกเตอร์ที่ชี้ไปที่ลบ Y .. ได้รับอนุสัญญาเหล่านั้น (โดยทั้งหมดแก้ไขฉันถ้าพวกเขาผิด!) วิธีหนึ่ง: เขียนฟังก์ชั่น LookAt หรือไม่ (lookAt (ตำแหน่งเวกเตอร์, เลนส์เวกเตอร์, เวกเตอร์ขึ้นไป)) …

2
ฉันจะส่งต่อคีย์บอร์ดอินพุตของ GLFW ไปยังวัตถุอื่นได้อย่างไร
ฉันมีปัญหาในการพยายามเรียกใช้เหตุการณ์แป้นพิมพ์ในคลาสอื่นด้วย GLFW3 ปัญหาที่ฉันมีคือ GLFW3 ใช้ฟังก์ชั่นคงที่สำหรับการป้อนข้อมูลตามที่แสดง: static UI u; ... ... static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { u.controls(window, key, action); } uเป็นแบบสแตติกและส่วนควบคุมจะเก็บอินพุตสำหรับคีย์ WSAD (วิธีเดียวที่ฉันจะได้รับเหตุการณ์สำคัญ) จากที่นี่การกดแป้นจะทำงานเพื่อแสดงว่ามีการกดแป้นใดในหน้าต่างคอนโซล ปัญหาที่ฉันมีคือพยายามใช้แป้นกดเพื่อจัดการกับตัวแปรในคลาสอื่น ฉันมีคลาสอื่นที่เรียกว่า MainMenu ที่มีฟังก์ชั่นupdate().มีวิธีที่ฉันสามารถใช้คลาส UI ของฉันภายในฟังก์ชั่นนี้หรือไม่?
9 opengl  c++  keyboard  glfw 

3
ฉันจะส่งเมทริกซ์หลายตัวไปยังจุดสุดยอดได้อย่างไร
ฉันกำลังฝึกอนิเมชั่นโดยใช้กระดูก / สกินนิ่ง ฉันกำลังพยายามส่งเมทริกซ์หนึ่งส่วนต่อจุดยอด ฉันนึกถึงสองแนวทางนี้ วิธีที่ 1 ฉันมีมือจับอันเดียวสำหรับเมทริกซ์กระดูกแต่ละอันเช่นนี้ u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]"); u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]"); และในการที่onDrawฉันส่งแต่ละคนไปยัง shader: GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0); เห็นได้ชัดว่านี่ไม่ใช่วิธีที่ดีถ้าฉันมีเมทริกซ์จำนวนมาก ความคิดที่สองของฉันที่ฉันยังไม่ได้ลองเนื่องจากมีโค้ดจำนวนมากสำหรับการปรับโครงสร้าง วิธีที่ 2 คือการใช้glUniformMatrix4fvเพื่อส่งพวกเขาทั้งหมดในครั้งเดียว (สมมติว่าฉันมี 20 เมทริกซ์) GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0); ที่เป็นmatrices float[16 * 20]แต่จากนั้นการปรับเปลี่ยนเมทริกซ์สำหรับแต่ละกระดูกจะค่อนข้างน่าเบื่อ ตัวอย่างเช่นถ้าฉันต้องการหาเมทริกซ์ที่ 3 ฉันต้องการบางสิ่งตามแนวของ float[] _3rd = Arrays.copy(matrices, 3*16, 4*16); และการประหยัดกลับคืนค่าสามารถเป็นที่น่ารำคาญยิ่งขึ้น …

3
ใช้เวลานานแค่ไหนสำหรับ OpenGL ในการอัพเดทหน้าจอจริง?
ฉันมีแอปทดสอบ OpenGL แบบง่าย ๆ ใน C ซึ่งดึงดูดสิ่งต่าง ๆ เพื่อตอบสนองต่อการป้อนข้อมูลสำคัญ (Mesa 8.0.4, ลองกับ Mesa-EGL และกับ GLFW, Ubuntu 12.04LTS บนพีซีที่ใช้ NVIDIA GTX650) การดึงค่อนข้างง่าย / เร็ว (หมุนประเภทของสิ่งของ) รหัสการทดสอบของฉันไม่ได้ จำกัด จำนวนการจงใจอย่างรอบคอบ แต่อย่างใดมันมีลักษณะดังนี้: while (true) { draw(); swap_buffers(); } ฉันหมดเวลาอย่างระมัดระวังและฉันพบว่าเวลาจากการโทรครั้งเดียวeglSwapBuffers()(หรือglfwSwapBuffersสิ่งเดียวกัน) ต่อไปคือ ~ 16.6 มิลลิวินาที เวลาจากหลังจากการโทรถึงeglSwapBuffers()ก่อนการโทรครั้งถัดไปจะน้อยกว่านั้นเล็กน้อยถึงแม้ว่าสิ่งที่ถูกวาดจะง่ายมาก เวลาที่การแลกเปลี่ยนบัฟเฟอร์ใช้เวลาน้อยกว่า 1 มิลลิวินาที อย่างไรก็ตามเวลาจากแอปเปลี่ยนสิ่งที่มันวาดในการตอบสนองต่อการกดปุ่มเพื่อการเปลี่ยนแปลงที่เกิดขึ้นจริงบนหน้าจอคือ> 150ms (ประมาณ 8-9 เฟรมมูลค่า) วัดจากการบันทึกกล้องของหน้าจอและคีย์บอร์ดที่ 60fps …

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

1
วิธีการใช้ OpenGL ที่ทันสมัยสำหรับเกม 2D?
ฉันพบบทแนะนำ "ทันสมัย" OpenGL (3.0+) มากมายสำหรับ 3D แต่ฉันพบว่าไม่มีอะไรเลยเมื่อมองหาข้อมูลเกี่ยวกับวิธีใช้สำหรับการพัฒนาเกม 2D ฉันจะเริ่มต้นใช้งาน OpenGL สำหรับ 2D gamedev ได้อย่างไร โดยเฉพาะฉันสนใจรับคำตอบของหัวข้อต่อไปนี้: ฉันจะตั้งค่าเมทริกซ์ต่าง ๆ สำหรับการฉายภาพแบบออโธกราฟฟิคได้อย่างไร? มีการใช้เฉดสีอย่างมากในแอปพลิเคชัน 2D เหมือนกับใน 3D หรือไม่? ถ้าเป็นเช่นนั้นอะไรคือวัตถุประสงค์ของพวกเขาในการตั้งค่า 2D? ฉันจะจัดการกับพื้นผิวจำนวนมากที่จำเป็นสำหรับเกม 2D ได้อย่างไร ฉันขอโทษสำหรับคำถามที่ค่อนข้างกว้าง แต่ฉันใช้เวลานานในการค้นหาและฉันพบข้อมูลที่มีประโยชน์น้อยมากที่ใช้กับ OpenGL ที่ทันสมัย
9 opengl  2d 

1
พื้นผิวประสานงานไม่ต่อเนื่องกับ mipmaps สร้างตะเข็บ
ฉันเพิ่งเริ่มเรียนรู้ openGL และฉันได้สิ่งประดิษฐ์นี้เมื่อสร้างพื้นผิวด้วย mipmaps โดยทั่วไปเมื่อชิ้นส่วนตัวอย่างขอบของพื้นผิวของฉันมันตรวจพบความไม่ต่อเนื่อง (พูดจาก 1 ถึง 0) และเลือก mipmap ที่เล็กที่สุดซึ่งสร้างรอยต่อที่น่าเกลียดนี้: ตะเข็บที่น่าเกลียด http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png ดังนั้นฉันจึงพยายามแทนที่ gradients ด้วยตนเองโดยใช้ textureGrad: //fragVert is the original vertex from the vertex shader vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5)); vec2 ll2 = ll; if (ll.x < …

1
2D โปรไฟล์ผิวด้านบนของน้ำ
ฉันพยายามสร้างเอฟเฟกต์ของความหนาของผิวน้ำด้วย shader ที่ยอด ฉันอยู่ในสภาพแวดล้อมของเกม 3 มิติ แต่มันเป็นมุมมองเลื่อนดังนั้นมุมมอง "2D" นี่คือบทแนะนำที่ดีเกี่ยวกับการสร้างเอฟเฟกต์ดังกล่าวใน 2D จริงโดยใช้ตัวแบ่งส่วน แต่ฉันคิดว่ามันใช้ไม่ได้ในกรณีนี้ สำหรับช่วงเวลาที่ฉันมีเครื่องบินเพียงลำเดียวฉันก็ใช้การหักเหแสง และฉันต้องการใช้เอฟเฟกต์ความหนาของน้ำ แต่ฉันไม่รู้จะทำยังไง ฉันไม่ได้พยายามที่จะสร้างการเสียรูป / การเคลื่อนที่ของน้ำโดยใช้จุดยอดในขณะนี้นี่ไม่ใช่ประเด็น ฉันไม่รู้ว่ามันเป็นไปได้หรือเปล่ากับ quad ที่เรียบง่ายบางทีฉันควรใช้วัตถุแบบนี้ นี่คือตัวอย่างบางส่วน. ฉันไม่มีความคิดเกี่ยวกับวิธีสร้างเอฟเฟกต์นี้ ขอบคุณมาก ! [ แก้ไข ] เพิ่มเอฟเฟกต์น้ำเรย์แมนเพื่อการอ้างอิงที่ดีขึ้นของเอฟเฟกต์

1
การจัดการแบบตาข่ายบน GPU vs CPU
แค่อยากรู้อยากเห็นเล็กน้อย - คุณทำการผสมตาข่ายบน CPU หรือใน shader ที่ไหน? ฉันทำทุกอย่างบน CPU และเพื่อนแนะนำให้ย้ายสิ่งต่างๆไปยังด้าน GPU หากคุณทำสิ่งต่าง ๆ เช่นอนิเมชั่นของกระดูก ... บน GPU คุณจะกลับมาตาข่ายได้อย่างไร? (เนื่องจากฉันกำลังตรวจจับการชนกันของข้อมูล ... )
9 opengl  3d 

1
gluLookAt ทำงานอย่างไร
จากความเข้าใจของฉัน gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); เทียบเท่ากับ: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); แต่เมื่อฉันพิมพ์ModelViewเมทริกซ์การเรียกเพื่อglTranslatef()ดูเหมือนจะทำงานไม่ถูกต้อง นี่คือข้อมูลโค้ด: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int …

2
ฉันต้องกังวลเกี่ยวกับการแสดงผลแบบ quad-based ในสถานการณ์จริงหรือไม่?
ส่วนใหญ่ในบทแรกของหนังสือแบบสุ่มเกี่ยวกับเทคนิคการแรสเตอร์และการเรนเดอร์ฉันพบวลีบางอย่างเกี่ยวกับระบบการเรนเดอร์แบบสามเหลี่ยมและแบบสี่ภาค ฉันไม่เคยเจอ GPU หรือไปป์ไลน์แบบ quad-based ฉันต้องกังวลเกี่ยวกับเรื่องนั้นเมื่อต้องจัดการกับ OpenGL 3.0+ หรือว่าเป็นเพียงแค่ของดั้งเดิม
9 opengl  gpu 

4
ผลกระทบของลูปที่มีความยาวผันแปรได้ใน GPU shaders
เป็นที่นิยมในการแสดงเนื้อหาขั้นตอนภายใน GPU เช่นใน demoscene (วาดรูปสี่เหลี่ยมจัตุรัสเดียวเพื่อเติมหน้าจอและปล่อยให้ GPU คำนวณพิกเซล) เรย์เดินขบวนเป็นที่นิยม: ซึ่งหมายความว่า GPU กำลังประมวลผลวนซ้ำที่ไม่รู้จักจำนวนหนึ่งต่อพิกเซล (แม้ว่าคุณจะมีขอบด้านบนเหมือนmaxIterations) การวนลูปที่มีความยาวผันแปรมีผลต่อประสิทธิภาพของ shader อย่างไร ลองนึกภาพ psuedocode ray-marching ที่เรียบง่าย: t = 0.f; while(t < maxDist) { p = rayStart + rayDir * t; d = DistanceFunc(p); t += d; if(d < epsilon) { ... emit p return; } } ตระกูล …

2
ฉันจะโหลดพื้นผิวด้วย SFML สำหรับ OpenGL ได้อย่างไร
ฉันกำลังมองหาที่NeHe ของพื้นผิวการทำแผนที่การกวดวิชา มันดูซับซ้อนเกินไปสำหรับการโหลดพื้นผิว มีวิธีการโหลดพื้นผิวใน SFML แล้วใช้มันใน Open GL หรือไม่ ฉันใช้ SFML สำหรับหน้าต่างของฉัน

3
ปัญหาการแมปเงาครั้งแรก
ฉันใช้การทำแผนที่เงาพื้นฐานเป็นครั้งแรกใน OpenGL โดยใช้ shaders และฉันประสบปัญหาบางอย่าง ด้านล่างคุณสามารถดูตัวอย่างของฉากที่แสดงผลของฉัน: กระบวนการของการแมปเงาที่ฉันกำลังติดตามคือฉันแสดงฉากให้กับ framebuffer โดยใช้ View Matrix จากมุมมองแสงและเมทริกซ์การฉายและแบบจำลองที่ใช้สำหรับการเรนเดอร์ปกติ ในรอบที่สองฉันส่งเมทริกซ์ MVP ด้านบนจากมุมมองแสงไปยังตัวแบ่งจุดยอดซึ่งเปลี่ยนตำแหน่งเป็นพื้นที่แสง ส่วนของ shader จะแบ่งมุมมองและเปลี่ยนตำแหน่งเป็นพิกัดพื้นผิว นี่คือจุดสุดยอดของฉัน #version 150 core uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 MVPMatrix; uniform mat4 lightMVP; uniform float scale; in vec3 in_Position; in vec3 in_Normal; in vec2 in_TexCoord; smooth out vec3 pass_Normal; …

2
จัดการกับแสงจำนวนมากในฉาก (พร้อมเฉดสี)
ฉันอยากรู้เกี่ยวกับวิธีจัดการกับแสงไฟมากมายในฉาก ให้แผนที่ขนาดใหญ่มากในเกมเล่นตามบทบาทกับดันเจี้ยน (พร้อมไฟในนั้น) ฯลฯ ฉันรู้เกี่ยวกับแสงที่เลื่อนออกไป แต่คำถามของฉันคือเพิ่มเติม: วิธีการที่ไม่ได้ทำให้ไฟจำนวนมาก เห็นได้ชัดว่าเป็นที่น่าพอใจที่จะแสดงแสงที่มีผลต่อฉากเท่านั้น แต่ฉันไม่รู้เทคนิค / อัลกอริทึมในการเก็บภาพ ไม่มีใครต้องการหรือสามารถให้แสง 500 จุดเพียงเพราะมีบางแห่งในแผนที่ แต่ไม่มีใครสามารถนำเส้นตรงจากแสงไปยังผู้เล่นและทดสอบว่ามีอะไรอยู่ระหว่างนั้นหรือไม่ ระยะทางดูไม่เหมือนตัวบ่งชี้ที่ดี (แสงแดด?) tl; dr: ฉันจะทราบได้อย่างไรว่าไฟใดที่ส่งผลกระทบต่อฉากเพื่อแสดงผลเท่านั้น

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