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

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

1
GLSL: ฉันจะเหวี่ยงทุ่นไปยัง int ได้อย่างไร
ใน Shader GLSL ส่วนฉันพยายามที่จะโยนลงไปfloat intคอมไพเลอร์ทำให้เกิดข้อผิดพลาด: ERROR: 0:60: '=' : cannot convert from 'mediump float' to 'highp int' ฉันพยายามเพิ่มความแม่นยำของint: mediump float indexf = floor(2.0 * mixer); highp int index = indexf; แต่ไม่มีประโยชน์ ฉันจะคัดเลือกนักแสดงที่intเหมาะสมได้อย่างไร
40 opengl  glsl  opengl-es 

5
ฉันควรใช้พื้นผิวที่ไม่ได้มีขนาดเท่ากับกำลัง 2 หรือไม่?
ในวันแรก ๆ ของ OpenGL และ DirectX ขนาดของพื้นผิวจะต้องเป็นพลังของสอง นั่นหมายถึงการแก้ไขค่าลอยสามารถทำได้อย่างรวดเร็วโดยใช้การเลื่อนและเช่นนั้น ตั้งแต่ OpenGL 2.0 (และก่อนหน้านั้นผ่านมิติส่วนขยาย) ที่ไม่ใช่พลังงานของสองพื้นผิวได้รับการสนับสนุน พื้นผิวพลังแห่งสองมีข้อได้เปรียบด้านประสิทธิภาพการทำงานกับ GPU แบบรวมและแยกแบบใหม่หรือไม่? พื้นผิวที่ไม่มีพลังงานสองข้อได้เปรียบมีอะไรบ้าง ประชากรเดสก์ท็อปที่สำคัญมีการ์ดที่รองรับพื้นผิวที่ไม่ใช่พลังงานหรือไม่?

6
การสร้างเอฟเฟ็กต์การสลับสีแบบย้อนยุคใน OpenGL
ฉันกำลังทำงานกับเกมที่คล้ายกับMegamanซึ่งฉันต้องเปลี่ยนสีของพิกเซลบางตัวในขณะใช้งานจริง สำหรับการอ้างอิง : ในMegamanเมื่อคุณเปลี่ยนอาวุธที่คุณเลือกจากนั้นจานสีของตัวละครหลักจะเปลี่ยนไปตามอาวุธที่เลือก ไม่ทั้งหมดของผีสางของการเปลี่ยนแปลงสีเพียงบางคนทำ เอฟเฟกต์แบบนี้เป็นเรื่องปกติและค่อนข้างง่ายที่จะทำกับ NES เนื่องจากโปรแกรมเมอร์สามารถเข้าถึงพาเล็ตและการแมปโลจิคัลระหว่างพิกเซลและดัชนีพาเล็ต สำหรับฮาร์ดแวร์ที่ทันสมัยสิ่งนี้ค่อนข้างท้าทายกว่าเพราะแนวคิดของจานสีไม่เหมือนกัน พื้นผิวทั้งหมดของฉันเป็นแบบ 32 บิตและไม่ใช้จานสี มีสองวิธีที่ฉันรู้เพื่อให้ได้ผลตามที่ฉันต้องการ แต่ฉันอยากรู้ว่าถ้ามีวิธีที่ดีกว่าในการบรรลุผลนี้ได้อย่างง่ายดาย สองตัวเลือกที่ฉันรู้คือ: ใช้ shader และเขียน GLSL บางอย่างเพื่อดำเนินการ "palette swapping" หากไม่สามารถใช้เฉดสีได้ (เช่นเนื่องจากการ์ดกราฟิกไม่รองรับ) ก็เป็นไปได้ที่จะลอกแบบพื้นผิว "ดั้งเดิม" และสร้างรุ่นที่แตกต่างกันโดยมีการเปลี่ยนสีที่นำไปใช้ล่วงหน้า เป็นการดีที่ฉันต้องการใช้ shader เนื่องจากดูเหมือนว่าตรงไปตรงมาและต้องการงานเพิ่มเติมเล็กน้อยเมื่อเทียบกับวิธีการทำซ้ำพื้นผิว ฉันกังวลว่าพื้นผิวที่ซ้ำซ้อนเพียงเพื่อเปลี่ยนสีในพวกเขากำลังสูญเสีย VRAM - ฉันไม่ควรกังวลเกี่ยวกับสิ่งนั้นหรือ แก้ไข : ฉันลงเอยด้วยการใช้เทคนิคของคำตอบที่ยอมรับและนี่คือ shader ของฉันสำหรับการอ้างอิง uniform sampler2D texture; uniform sampler2D colorTable; uniform float paletteIndex; void main() …

6
เหตุใดเราใช้ 4x4 เมทริกซ์เพื่อเปลี่ยนสิ่งต่าง ๆ ในแบบ 3 มิติ
ในการแปลเวคเตอร์ 10 หน่วยในทิศทาง X ทำไมเราต้องใช้เมทริกซ์ เราสามารถเพิ่ม 10 ลงในเสื่อ [0] [0] และเราก็ได้ผลลัพธ์เดียวกัน
36 opengl  3d  matrix 

4
วัตถุประสงค์ของ Vertex Array Objects คืออะไร?
ฉันเพิ่งเริ่มต้นด้วย OpenGL ฉันยังไม่เข้าใจจริงๆว่า Vertex Array Objects คืออะไรและสามารถใช้งานได้อย่างไร ถ้า Vertex Buffer Object ถูกใช้เพื่อจัดเก็บข้อมูลจุดสุดยอด (เช่นตำแหน่งและพิกัดพื้นผิว) และ VAOs จะมีเฉพาะสถานะแฟล็กซึ่งสามารถใช้งานได้ที่ไหน? วัตถุประสงค์ของพวกเขาคืออะไร? เท่าที่ฉันเข้าใจจากวิกิพีเดีย (ไม่สมบูรณ์และไม่ชัดเจน) VAOs จะใช้ในการตั้งค่าสถานะ / สถิติสำหรับทุกจุดสุดยอดตามคำสั่งที่อธิบายไว้ใน Element Array Buffer แต่วิกินั้นคลุมเครือเกี่ยวกับมันและฉัน ' m ไม่แน่ใจจริงๆเกี่ยวกับสิ่งที่ VAOs ทำจริงๆและฉันจะจ้างพวกเขาได้อย่างไร
36 opengl 

7
ฉันจะปรับปรุงความเร็วการเรนเดอร์ของเกมประเภท Voxel / Minecraft ได้อย่างไร?
ฉันกำลังเขียนโคลนของ Minecraft เอง (เขียนด้วยภาษาจาวา) มันใช้งานได้ดีในขณะนี้ ด้วยระยะการดู 40 เมตรฉันสามารถกด 60 FPS บน MacBook Pro 8,1 ได้อย่างง่ายดาย (Intel i5 + Intel HD Graphics 3000) แต่ถ้าฉันวางระยะทางในการมองที่ 70 เมตรฉันจะไปถึง 15-25 FPS ใน Minecraft ตัวจริงฉันสามารถใส่ความไม่ลงรอยกันในการมองไกล (= 256m) ได้โดยไม่มีปัญหา ดังนั้นคำถามของฉันคือฉันควรทำอย่างไรเพื่อทำให้เกมของฉันดีขึ้น? การเพิ่มประสิทธิภาพที่ฉันใช้: เก็บเฉพาะชิ้นส่วนในหน่วยความจำเท่านั้น (ขึ้นอยู่กับระยะการมองของผู้เล่น) Frustum culling (ครั้งแรกบนชิ้นแล้วบนบล็อก) วาดเฉพาะใบหน้าที่มองเห็นได้จริงๆของบล็อกเท่านั้น ใช้รายการต่ออันที่มีบล็อกที่มองเห็นได้ ส่วนที่มองเห็นได้จะเพิ่มเข้าไปในรายการนี้ หากพวกเขากลายเป็นล่องหนพวกเขาจะถูกลบออกจากรายการนี้โดยอัตโนมัติ บล็อกกลายเป็น (ใน) มองเห็นได้โดยการสร้างหรือทำลายบล็อกเพื่อนบ้าน การใช้รายการต่ออันประกอบด้วยบล็อกการปรับปรุง กลไกเดียวกับรายการบล็อกที่มองเห็นได้ ใช้newคำสั่งแทบไม่มีในลูปเกม …

5
การวาดกระเบื้องจำนวนมากด้วย OpenGL วิธีการที่ทันสมัย
ฉันกำลังทำงานกับเกมพีซีที่มีไทล์ / สไปรต์กับทีมงานของผู้คนและเรากำลังประสบกับปัญหาด้านประสิทธิภาพ ครั้งสุดท้ายที่ฉันใช้ OpenGL คือประมาณปี 2004 ดังนั้นฉันจึงสอนตัวเองถึงการใช้โปรไฟล์หลักและฉันรู้สึกสับสนเล็กน้อย ฉันต้องวาดในบริเวณใกล้เคียงของกระเบื้อง 250-750 48x48 ไปที่หน้าจอทุกเฟรมรวมทั้งอาจจะประมาณ 50 สไปรต์ ไทล์เปลี่ยนเฉพาะเมื่อโหลดระดับใหม่และสไปรต์กำลังเปลี่ยนแปลงอยู่ตลอดเวลา กระเบื้องบางชิ้นประกอบไปด้วยชิ้นส่วน 24x24 สี่ชิ้นและส่วนใหญ่ (แต่ไม่ทั้งหมด) ของสไปรต์มีขนาดเท่ากับกระเบื้อง กระเบื้องและสไปรท์จำนวนมากใช้การผสมอัลฟา ตอนนี้ฉันกำลังทำทั้งหมดนี้ในโหมดเร่งด่วนซึ่งฉันรู้ว่าเป็นความคิดที่ไม่ดี เหมือนกันเมื่อสมาชิกในทีมของเราพยายามเรียกใช้เขาจะได้รับอัตราเฟรมที่ไม่ดีมาก (~ 20-30 fps) และมันแย่กว่ามากเมื่อมีไทล์มากขึ้นโดยเฉพาะอย่างยิ่งเมื่อไทล์เหล่านั้นเป็นแบบนั้น ถูกตัดเป็นชิ้น ๆ ทั้งหมดนี้ทำให้ฉันคิดว่าปัญหาคือจำนวนการเรียกสายที่กำลังทำอยู่ ฉันคิดถึงวิธีแก้ปัญหาที่เป็นไปได้สองสามอย่างนี้ แต่ฉันต้องการเรียกใช้พวกเขาโดยบางคนที่รู้ว่าพวกเขากำลังพูดถึงอะไรฉันจึงไม่เสียเวลากับเรื่องโง่ ๆ : กระเบื้อง: เมื่อมีการโหลดเลเวลให้วาดไทล์ทั้งหมดลงในบัฟเฟอร์เฟรมที่แนบกับพื้นผิวที่มีขนาดใหญ่และเพียงแค่วาดสี่เหลี่ยมขนาดใหญ่ที่มีพื้นผิวนั้นติดอยู่ทุกเฟรม ใส่กระเบื้องทั้งหมดลงในบัฟเฟอร์จุดสุดยอดแบบคงที่เมื่อโหลดระดับและวาดพวกเขาในแบบนั้น ฉันไม่รู้ว่ามีวิธีการวาดวัตถุที่มีพื้นผิวแตกต่างกันด้วยการเรียกใช้ glDrawElements เพียงครั้งเดียวหรือไม่หรือถ้านี่คือสิ่งที่ฉันต้องการจะทำ อาจจะแค่ใส่กระเบื้องทั้งหมดลงในพื้นผิวยักษ์ใหญ่และใช้พิกัดพื้นผิวตลกใน VBO sprites: วาดเทพดาแต่ละอันด้วยการเรียกแยกต่างหากไปยัง glDrawElements ดูเหมือนว่าจะเกี่ยวข้องกับการสลับพื้นผิวมากมายซึ่งฉันบอกว่าไม่ดี อาเรย์พื้นผิวอาจมีประโยชน์ที่นี่? ใช้ VBO แบบไดนามิกอย่างใด …
35 opengl 

10
อะไรทำให้เกมดู“ ดี”? [ปิด]
ฉันทำงานเกม 3D space e โดยใช้ OpenGL และ C ++ และฉันวางแผนที่จะมุ่งเน้นที่การให้เกมที่ทันสมัย, กราฟิกที่สะดุดตา แต่ยิ่งฉันคิดว่ายิ่งฉันรู้มากขึ้นฉันไม่รู้ว่าอะไรทำให้กราฟิก "ดี". แน่นอนว่าฉันสามารถไปเล่นเกม AAA ที่เป็นที่รู้จักกันดีและได้รับความสุขในกราฟิกที่รวบรวมได้อย่างน่าอัศจรรย์ แต่ฉันไม่รู้ว่ากราฟิกนั้นดูดีแค่ไหน (นี่คือเหตุผลที่ฉันถือว่าเกมเป็นศิลปะ!) นี่คือสิ่งที่ฉันคิดได้ตอนนี้: พื้นผิวที่มีคุณภาพสูง โมเดลคุณภาพสูง รูปแบบแสงที่ดี การทำแผนที่ Bumpmapping + specularity UI คุณภาพสูงถ้ามี ความมั่งคั่งของการไม่โพสต์เกินจริง ฉันขอให้ที่นี่ด้วยความหวังของนักพัฒนาเกมที่มีประสบการณ์ซึ่งผลิตเกมและรู้ว่าพวกเขาทำงานอย่างไรทั้งภายในและภายนอกสามารถอธิบายเทคนิคบางอย่างที่รับประกันกราฟิกของเกมให้ดูดี "และเคล็ดลับแปลก ๆ ที่ไม่รู้จักกันดี นั่นมันยอดเยี่ยมมาก ขอบคุณ!
34 opengl  3d  graphics 


2
วิธีที่ดีในการสร้างลูปเกมใน OpenGL
ขณะนี้ฉันเริ่มเรียน OpenGL ที่โรงเรียนและฉันเริ่มทำเกมง่ายๆเมื่อวันก่อน (ด้วยตัวเองไม่ใช่เพื่อโรงเรียน) ฉันใช้ freeglut และสร้างมันใน C ดังนั้นสำหรับวงเกมของฉันฉันเพิ่งใช้ฟังก์ชั่นที่ฉันส่งผ่านglutIdleFuncเพื่ออัปเดตรูปวาดและฟิสิกส์ทั้งหมดในรอบเดียว นี่เป็นสิ่งที่ดีสำหรับแอนิเมชั่นธรรมดา ๆ ที่ฉันไม่ได้สนใจมากเกินไปเกี่ยวกับอัตราเฟรม แต่เนื่องจากเกมส่วนใหญ่เป็นพื้นฐานของฟิสิกส์ฉันต้องการ (ต้อง) ผูกมัดว่ามันอัพเดตเร็วแค่ไหน ดังนั้นความพยายามครั้งแรกของฉันคือการให้ฟังก์ชั่นของฉันฉันส่งไปที่glutIdleFunc( myIdle()) เพื่อติดตามเวลาที่ผ่านไปนับตั้งแต่การโทรครั้งก่อนและอัปเดตฟิสิกส์ (และกราฟิกปัจจุบัน) ทุกมิลลิวินาที ฉันเคยtimeGetTime()ทำสิ่งนี้ (โดยใช้<windows.h>) และนี่ทำให้ฉันคิดว่าการใช้ฟังก์ชั่นว่างเป็นวิธีที่ดีในการวนรอบเกมหรือไม่? คำถามของฉันคือวิธีที่ดีกว่าในการใช้ลูปเกมใน OpenGL คืออะไร ฉันควรหลีกเลี่ยงการใช้ฟังก์ชันว่างหรือไม่
31 opengl  c  game-loop 


9
ฉันควรศึกษา OpenGL ต่อไปหรือเพียงแค่เปลี่ยนเป็น DirectX เพื่อให้ฉันมีโอกาสได้งานทำในอุตสาหกรรมเกมมากขึ้น [ปิด]
ฉันได้เรียนรู้การเขียนโปรแกรมกราฟิกมาระยะหนึ่งแล้วโดยใช้ OpenGL และ Linux ฉันค่อนข้างคุ้นเคยกับแนวคิดส่วนใหญ่แล้ว แต่ฉันต้องการที่จะเพิ่มพูนความรู้ของฉันและในที่สุดก็มีอาชีพด้านการพัฒนาเกมโดยเฉพาะการพัฒนาโปรแกรมเกม สำหรับฉันแล้วดูเหมือนว่าสตูดิโอเกมส่วนใหญ่สร้างเกมสำหรับ Windows โดยใช้ DirectX แก้ไข: ฉันรู้ว่าคำถาม OpenGL กับ DirectX ได้รับการถามที่นี่มาก่อน แต่ฉันไม่พบคำตอบในมุมมองที่ฉันต้องการ แก้ไข 2: หลังจากอ่านคำตอบ / ความคิดเห็นทั้งหมดฉันตัดสินใจดำน้ำลึกลงไปในกราฟิกด้วย OpenGL / GLSL แต่ฉันจะลองเล่นกับ DX ด้วยเช่นกันเพื่อทำความเข้าใจพื้นฐานของ API ฉันอยากจะขอบคุณทุกคนสำหรับคำตอบและข้อมูลเชิงลึกที่คุณให้กับฉัน

3
ฉันจะใช้ anti-aliasing ใน OpenGL ได้อย่างไร
ฉันต้องการทำ anti-aliasing แบบเต็มหน้าจอใน OpenGL และไม่ต้องการใช้ anti-aliasing ที่ OpenGL จัดทำขึ้นเองเนื่องจากฉันกำลังสร้างเกมและต้องการเอฟเฟกต์ดีๆ ฉันควรดำเนินการอย่างไร

2
เกม Android ควรใช้เธรดกี่เธรด
อย่างน้อยที่สุดเกม OpenGL Android มีด้าย UI และด้าย Renderer GLSurfaceViewที่สร้างขึ้นโดย Renderer.onDrawFrame()ควรทำงานขั้นต่ำเพื่อรับ FPS ที่ยิ่งใหญ่ที่สุด ฟิสิกส์, AI, ฯลฯ ไม่จำเป็นต้องวิ่งทุกเฟรมดังนั้นเราสามารถใส่มันเข้าไปในเธรดอื่นได้ ตอนนี้เรามี: เธรด Renderer - อัปเดตแอนิเมชันและวาดโพลี เธรดเกม - อัปเดตลอจิกและฟิสิกส์, AI, ฯลฯ เธรด UI - การโต้ตอบกับ Android UI เท่านั้น เนื่องจากคุณไม่ต้องการบล็อกเธรด UI เลยฉันจึงรันอีกหนึ่งเธรดสำหรับตรรกะของเกม บางทีนั่นอาจไม่จำเป็นเลย มีเหตุผลในการรันตรรกะของเกมในเธรด renderer หรือไม่?

4
ทำไมไปป์ไลน์ที่ตั้งโปรแกรมได้ (GLSL) เร็วกว่าไปป์ไลน์ที่กำหนดตายตัว?
ดังนั้นฉันจึงสอนตัวเองว่า GLSL และกำลังพยายามหาสาเหตุว่าทำไมจึงควรเร็วกว่าฟังก์ชั่นคงที่ เหตุผลที่ฉันมีปัญหาก็คือจากความเข้าใจของฉันผู้สร้างที่คุณสร้างจะแทนที่ส่วนของท่อที่เคยมีมาก่อน ดังนั้นการเสนอเวอร์ชั่นของคุณจะช่วยเร่งความเร็วได้อย่างไร สิ่งเดียวที่ฉันคิดได้ก็คือถ้าคุณพยายามที่จะบอกว่าสมการแสงของคุณมาก่อนคุณจะต้องทำการคำนวณบน CPU แต่ตอนนี้คุณสามารถทำการคำนวณบน GPU ซึ่งจะเร็วขึ้น ฉันเข้าใจสิ่งนี้ถูกต้องหรือไม่
27 opengl  glsl 

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