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

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

3
เหตุใดจึงเป็นไปได้ที่จะพบการประสานพื้นผิวมากกว่า 1 หรือน้อยกว่า 0
ฉันกำลังศึกษาข้อความเกี่ยวกับtexture mappingและในpreparing to drawเซสชั่นฉันอ่าน: กำหนดพารามิเตอร์การห่อพื้นผิว สิ่งนี้จะควบคุมสิ่งที่จะเกิดขึ้นเมื่อมีการประสานพื้นผิวมากกว่า 1.0 หรือน้อยกว่า 0.0 ที่พบ: glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap); โดยที่ wrap คือ: GL_REPEAT: ระบุว่ารูปแบบนี้จะทำซ้ำ (เช่นล้อมรอบ) หากพบว่าพิกัดพื้นผิวที่แปลงสภาพน้อยกว่า 0.0 หรือมากกว่า 1.0 จะพบ GL_CLAMP: ระบุว่ารูปแบบจะ“ ติด” กับค่าที่ 0.0 หรือ 1.0 แต่ไม่มีคำอธิบายว่าอะไรเป็นสาเหตุของการเผชิญหน้ากับพิกัดพื้นผิว เช่นสมมติว่าฉันเพิ่งวาดสี่เหลี่ยมและฉันต้องการใช้รูปภาพเป็นพื้นผิวบนมันเป็นไปได้หรือไม่ที่จะพบพิกัดดังกล่าว?

2
การแรเงาแบบเรียงต่อกันของกระเบื้องการคำนวณ frusta ของกระเบื้องใน OpenGL
ฉันพยายามแรเงาแบบเรียงต่อกันบนกระเบื้องใน OpenGL โดยใช้ตัวประมวลผล แต่ฉันได้รับอุปสรรคเมื่อพยายามสร้าง frustum สำหรับแต่ละไทล์ ฉันใช้การสาธิตฟอร์เวิร์ด + ของ AMD (เขียนใน D3D) เป็นแนวทาง แต่ดูเหมือนว่าไฟจะถูกกำจัดเมื่อพวกเขาไม่ควร UPDATE อ่านด้านล่างสำหรับการปรับปรุง นี่คือ shader การคำนวณของฉัน (สมบูรณ์): #version 430 core #define MAX_LIGHTS 1024 #define MAX_LIGHTS_PER_TILE 40 #define WORK_GROUP_SIZE 16 struct PointLight { vec3 position; float radius; vec3 color; float intensity; }; layout (binding = 0, rgba32f) uniform …

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

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

2
ฉันควรกังวลอะไรเมื่อเปลี่ยนแหล่งกำเนิด OpenGL ไปที่ด้านซ้ายบนของหน้าจอ
เพื่อการศึกษาด้วยตนเองฉันเขียนเครื่องมือ platformer 2D ใน C ++ โดยใช้ SDL / OpenGL ตอนแรกฉันเริ่มต้นด้วย SDL บริสุทธิ์โดยใช้บทเรียนบน sdltutorials.com และ lazyfoo.net แต่ตอนนี้ฉันใช้ SDL เพื่อสร้างบริบทการแสดงผล OpenGL แล้วแสดงผลด้วยฟังก์ชั่น OpenGL (โหมดเฉพาะทันที แต่ฉันเรียนรู้เกี่ยวกับ VAOs / VBOs ) ฉันใช้ SDL สำหรับอินเตอร์เฟสเสียง ฯลฯ เท่านั้น SDL ใช้ระบบพิกัดที่มีจุดกำเนิดที่ด้านซ้ายบนของหน้าจอและแกน y บวกที่ชี้ลง ง่ายต่อการตั้งค่าการฉายภาพของฉันใน OpenGL เพื่อสะท้อนสิ่งนี้ ฉันรู้ว่าพิกัดพื้นผิวเป็นระบบทางด้านขวามือที่มีค่าตั้งแต่ 0 ถึง 1 - พลิกพื้นผิวในแนวตั้งก่อนที่จะทำการเรนเดอร์ (เช่นนั้นพลิกไฟล์ก่อนที่จะโหลด) ทำให้ได้พื้นผิวที่แสดงอย่างถูกต้อง ... พื้นผิวทั้งหมด …
11 c++  opengl  2d  sdl 

3
ใช้ OpenGL หรือ GLSL ล้วนๆ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Game Exchange Stack Exchange ปิดให้บริการใน6 ปีที่ผ่านมา ฉันสนใจที่จะศึกษาการเขียนโปรแกรมกราฟิกจุดเริ่มต้นที่ชัดเจนคือการเรียนรู้ OpenGL แต่การรวบรวมข้อมูลที่กระจัดกระจายรอบ ๆ ฟอรัมและไซต์ดูเหมือนว่าการใช้งาน OpenGL อย่างแท้จริงนั้นจะจางหายไปเนื่องจากสิ่งต่าง ๆ ส่วนใหญ่ pre-3.0 กำลังถูกคัดค้านและอ้างถึงการทบทวนใน Amazon นอกจากนี้หนังสือที่ฉันได้เห็นดูเหมือนว่ายอดเยี่ยมครอบคลุมรุ่นใหม่ แต่เพียงบางส่วนเพราะส่วนที่ดีของหนังสือสอนฟังก์ชั่นที่เลิกใช้แล้วและมีหนังสือเฉพาะสำหรับ GLSL นี่คือที่ฉันพบปัญหาแรกของฉันฮาร์ดไดรฟ์บางตัวไม่รองรับ GLSL รวมถึงโน้ตบุ๊กที่มี Intel รวมกราฟิกที่ฉันวางแผนไว้ว่าจะใช้ ฟังก์ชั่น GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); ทำให้เกิดความผิดพลาดในการแบ่งส่วนและจากรูปลักษณ์ของมันไดรเวอร์ของฉันไม่รองรับเฉดสี ดังนั้นคำถามของฉันคือความเป็นไปได้ในการสร้างเกมเฉพาะใน OpenGL คืออะไร ฉันจะหายไปคุณสมบัติที่ดีที่ไม่สามารถถูกแทนที่ได้จากภาษา Shader หรือไม่? และฮาร์ดแวร์ประเภทใด (ฉันหวังว่าจะได้ใช้เกมกับ shaders อย่างถูกต้อง?
11 opengl  glsl 

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

3
แอนิเมชันใน OpenGL โดยใช้โมเดล 3 มิติ
ฉันได้สร้างแบบจำลองใน Blender ตอนนี้ฉันต้องการอ่านโมเดล 3 มิติในโปรแกรม c ++ ของฉัน ฉันคิดว่าแบบจำลองสามารถส่งออกไปยังรูปแบบไฟล์ต่าง ๆ เช่น. obj, .3ds หรือ COLLADA จากนั้นสามารถอ่านได้ในโปรแกรม c ++ ฉันค้นหาเว็บเพื่อทำสิ่งนั้นมาระยะหนึ่งแล้วพบบทเรียนจำนวนมาก แต่ฉันพบปัญหากับพวกเขาส่วนใหญ่ ตัวอย่างเช่นในการกวดวิชา Nehe พวกเขาใช้ glaux ซึ่งฉันไม่ต้องการใช้ในโปรแกรมของฉัน และบทเรียนที่เหลือใช้ md2 ซึ่ง Blender ไม่รองรับ ใครสามารถแนะนำฉันว่ารูปแบบไฟล์ใดที่จะใช้สำหรับการส่งออกโมเดล 3 มิติและวิธีโหลดไฟล์นั้นในโปรแกรม OpenGL ของฉัน ฉันจะทำให้โมเดลนั้นเคลื่อนไหวได้อย่างไร เป็นไปได้หรือไม่ที่จะเพิ่มเอฟเฟ็กต์พิเศษเช่นการจับคู่โทนเสียงหลังจากโหลดในโปรแกรม c ++ ด้วย OpenGL แล้ว ถ้าใช่แล้วได้อย่างไร PS ฉันใช้ Linux สำหรับการพัฒนาเกม

1
จะใช้แอพพลิเคชั่น OpenGL แบบมัลติเธรดเพื่ออัพเดต VBOs และใช้งานพร้อมกันได้อย่างไร?
ฉันมีแอพพลิเคชั่นที่เรียบง่าย มันมีสองกระทู้แต่ละคนมีบริบทการแสดงผลของตัวเอง แต่พวกเขาแบ่งปัน VBO หนึ่ง (นี้ใช้งานได้ผมทดสอบมัน) ตอนนี้สิ่งที่ฉันต้องการ: หนึ่งเธรดกำลังแสดงผลข้อมูลบางส่วนจากครึ่งแรกของ VBO และเธรดที่สองกำลังอัปเดตส่วนที่สองของ VBO เมื่อฉันไม่อัปเดต VBO มันก็ใช้ได้ดี แต่ฉันมีปัญหาแปลก ๆ บางอย่างเมื่ออัปเดต เมื่อฉันใช้glMapBufferเพื่ออัปเดต VBO (ในเธรดที่สอง), ในเธรดแรก, โดยส่วนใหญ่, มันไม่มีการแสดงผลใด ๆ - ทั้งหน้าจอนั้นชัดเจน (หลังจากการglClearโทร) ดูเหมือนว่าจะไม่สามารถสัมผัสข้อมูลจาก VBO (เป็นที่เข้าใจได้เพราะบัฟเฟอร์ทั้งหมดถูกแมปและดังนั้นจึงสามารถล็อคได้อย่างใด) ผมพยายามที่จะใช้ซึ่งการใช้งานglMapBufferRange GL_MAP_UNSYNCHRONIZED_BITนี่ควรหมายความว่า "อย่ารอและใช้ VBO ตามที่คุณต้องการฉัน (โปรแกรม) จะซิงโครไนซ์ด้วยตนเอง" นอกจากนี้เมื่อฉัน map ช่วงของ VBOs และแสดงผลข้อมูลจากส่วนอื่นก็ไม่ควรจะรอ glMapBufferแต่ฉันประสบปัญหาเดียวกับผมด้วย ใครสามารถช่วยฉันแก้ไขหรืออธิบายได้ว่าทำไมมันถึงเกิดขึ้น

1
การฟื้นฟูมาตรฐาน glVertexAttribPointer
glVertexAttribPointer (ดัชนี, ขนาด, ประเภท, ปกติ, ก้าว, ตัวชี้); ถ้าฉันใช้ type = GL_UNSIGNED_BYTE และทำให้ปกติ = GL_TRUE มันเป็นมาตรฐานได้อย่างไร ข้อมูลจะถูกหารด้วย 256 สำหรับการทำให้เป็นมาตรฐานหรือไม่ หรือ? นี่หมายความว่าไม่มีทางที่จะมีค่าปกติที่ '1.0f'
11 opengl  3d 

2
ฉันจะใช้การทดสอบเชิงลึกและความโปร่งใสของพื้นผิวร่วมกันในโลก 2.5D ของฉันได้อย่างไร
หมายเหตุ:ฉันได้พบคำตอบแล้ว (ซึ่งฉันจะโพสต์หลังจากคำถามนี้) - ฉันแค่สงสัยว่าฉันทำถูกหรือว่ามีวิธีที่ดีกว่า ฉันสร้างเกมภาพสามมิติ "2.5D" โดยใช้ OpenGL ES (JOGL) โดย "2.5D" ฉันหมายความว่าโลกนี้เป็น 3D แต่มันถูกสร้างการแสดงผลโดยใช้แผ่นกระเบื้องสามมิติแบบสองมิติ ปัญหาเดิมที่ฉันต้องแก้ไขก็คือพื้นผิวของฉันจะต้องแสดงผลตามลำดับ (จากด้านหลังไปข้างหน้า) เพื่อให้กระเบื้องซ้อนทับอย่างถูกต้องเพื่อสร้างผลที่เหมาะสม หลังจากอ่านเสร็จฉันก็รู้ได้ทันทีว่านี่เป็นวิธี 2D "หมวกเก่า" เรื่องนี้กลายเป็นเรื่องยากที่จะทำอย่างมีประสิทธิภาพเนื่องจากผู้เล่นสามารถปรับเปลี่ยนโลก 3 มิติ (ดังนั้นสิ่งต่างๆสามารถปรากฏที่ใดก็ได้ในพื้นที่ 3 มิติ) - ดูเหมือนว่าฉันใช้ประโยชน์จากบัฟเฟอร์ความลึก นั่นหมายความว่าฉันไม่ต้องกังวลกับการแสดงสิ่งต่าง ๆ ในลำดับที่ถูกต้อง อย่างไรก็ตามฉันประสบปัญหา หากคุณใช้GL_DEPTH_TESTและGL_BLENDร่วมกันมันจะสร้างเอฟเฟกต์ที่วัตถุจะถูกผสมกับพื้นหลังก่อนที่จะ "เรียงลำดับ" ตามลำดับ z (หมายความว่าคุณได้รับการทับซ้อนแบบแปลก ๆ ที่ควรมีความโปร่งใส) นี่คือรหัสหลอกที่ควรแสดงให้เห็นถึงปัญหา (โดยบังเอิญฉันใช้ libgdx สำหรับ Android) create() { // ... // …

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

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

1
วิธีการสุ่มวางเอนทิตีที่ไม่ทับซ้อนกัน?
ฉันกำลังสร้างสภาพแวดล้อมที่สร้างแบบสุ่มสำหรับเกมที่ฉันกำลังพัฒนา ฉันใช้และการเข้ารหัสในOpenGLJava ฉันกำลังพยายามวางต้นไม้ในโลกของฉัน (เพื่อสร้างป่า) แต่ฉันไม่ต้องการให้แบบจำลองทับซ้อนกัน (ซึ่งเกิดขึ้นเมื่อวางต้นไม้สองต้นใกล้กันเกินไป) นี่คือภาพสิ่งที่ฉันพูดถึง: ฉันสามารถให้รหัสเพิ่มเติมหากจำเป็น แต่นี่คือตัวอย่างสำคัญ ฉันกำลังจัดเก็บวัตถุของฉันในด้วยArrayList List<Entity> entities = new ArrayList<Entity>();ฉันจะเพิ่มรายการนั้นโดยใช้: Random random = new Random(); for (int i = 0; i < 500; i++) { entities.add(new Entity(tree, new Vector3f(random.nextFloat() * 800 - 400, 0, random.nextFloat() * -600), 0, random.nextFloat() * 360, 0, 3, 3, 3); …
11 opengl  java  objects 

1
วาดครึ่งกลางของทรงกลมโดยทางโปรแกรม
ฉันพยายามสร้างครึ่งกลางของทรงกลม โดยทั่วไปเพื่อสร้างทรงกลมจะมีการกำหนดหมายเลขสแต็กและหมายเลขสแลชและมีตัวแปรสองตัวphi(สำหรับสไลซ์) และtheta(สำหรับสแต็ค) ที่รับผิดชอบต่อความก้าวหน้า และกระบวนการนี้แบ่งออกเป็นการสร้างฝาด้านล่างลำตัวและฝาปิดด้านบน (ดังที่เห็นด้านล่าง) เพื่อให้ได้ครึ่งกลาง ( thetaตรงกลาง 50% ดังด้านล่าง) เราจำเป็นต้องเว้นการแคปและแก้ไขส่วนใดส่วนหนึ่ง ฉันกำลังเล่นกับหมายเลข stack ( 1/4*stackNumbers to 3/4*stackNumbers) แต่ไม่ได้ให้ผลลัพธ์ที่ต้องการ ฉันจะแก้ไขการสร้างทรงกลมเพื่อให้ได้ครึ่งกลาง ( pi/4 <theta <pi*3/4) ได้อย่างไร ปัญหาโดยรวมของฉันคือฉันจะแบ่งทรงกลมออกเป็น 3 ส่วนต่าง ๆ ได้อย่างไรตอนบน 25%, กลาง 50% และ 25% ด้านล่าง? นี่คือรหัสยอดนิยมสำหรับการสร้างทรงกลมโดยทางโปรแกรม: private void generateSphere(int stackNumber, int sliceNumber, boolean facingOut) { int capVertexNumber = 3 …

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