[OpenGL, VBO] zeichnet nichts

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Hallo, ich versuche gerade mit OpenGL (und PyGame um ein Fenster dafür zu erzeugen) mittels VBOs zu zeichnen.

Leider bleibt der Bildschirm schwarz, die Vertex-Positionen passen aber (direkt gezeichnet klappt es); d.h. irgendwo fehlt etwas bei meinem Umgang mit dem VBO. Was habe ich übersehen?

Code: Alles auswählen

from OpenGL.GL import *
from OpenGL.GLU import *
from ctypes import *

import pygame, array
from pygame.locals import *

def main():
	pygame.init()
	pygame.display.set_mode((800, 600), DOUBLEBUF|OPENGL)
	
	glMatrixMode(GL_PROJECTION)
	glLoadIdentity()
	glOrtho(0, 800, 0, 600, -1, 1)
	
	glMatrixMode(GL_MODELVIEW)
	
	# create VBO
	vbo = GLuint(0)
	glEnableVertexAttribArray(1);
	glGenBuffers(1, vbo)
	
	# setup VBO-data
	vertices = array.array('f', [
		0, 0,
		100, 0,
		100, 100,
		0, 100
	])
	glBindBuffer(GL_ARRAY_BUFFER, vbo)
	glBufferData(GL_ARRAY_BUFFER, vertices.tostring(), GL_STATIC_DRAW)
	
	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				pygame.quit()
				quit()

		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
		
		# draw using VBO
		glDrawArrays(GL_QUADS, 0, 8);
		
		# works when drawn directly
		"""
		glBegin(GL_QUADS)
		glVertex2f(0, 0)
		glVertex2f(100, 0)
		glVertex2f(100, 100)
		glVertex2f(0, 100)
		glEnd()
		"""
		
		pygame.display.flip()
		pygame.time.wait(10)

if __name__ == '__main__':
	main()
Danke im Voraus!

LG Glocke
Benutzeravatar
__blackjack__
User
Beiträge: 14184
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@glocke: Kann bestätigen das da nix gezeichnet wird.

Anmerkungen zum Quelltext: Zu viele Sternchen-Importe. Bei den OpenGL-Modulen könnte man ja meinen, dass das noch relativ ungefährlich weil die Namen da alle noch mal einen `gl`-Präfix haben, aber da werden ja auch andere Namen definiert und auch aus anderen Modulen importiert die man sich damit dann *auch* in den aktuellen Namensraum holt. Und man weiss so nicht welche Namen aus `GL` und welche aus `GLU` kommen. Und ist die Reihenfolge der Sternchen-Importe wichtig?

Dann wird noch alles aus `ctypes` importiert, aber nichts davon wird verwendet.

Zeichenkettenliterale sind nicht zum auskommentieren von Code gedacht.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Danke für deine Anmerkungen!

Hast du eine Idee woran es liegt, dass nichts gezeichnet wird?

Hier der ausgebesserte Code:

Code: Alles auswählen

import OpenGL.GL as gl

import pygame, array
from pygame.locals import DOUBLEBUF, OPENGL

def main():
	pygame.init()
	pygame.display.set_mode((800, 600), DOUBLEBUF|OPENGL)
	
	gl.glMatrixMode(gl.GL_PROJECTION)
	gl.glLoadIdentity()
	gl.glOrtho(0, 800, 0, 600, -1, 1)
	
	gl.glMatrixMode(gl.GL_MODELVIEW)
	
	# create VBO
	vbo = gl.GLuint(0)
	gl.glEnableVertexAttribArray(1);
	gl.glGenBuffers(1, vbo)
	
	# setup VBO-data
	vertices = array.array('f', [
		0, 0,
		100, 0,
		100, 100,
		0, 100
	])
	gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vbo)
	gl.glBufferData(gl.GL_ARRAY_BUFFER, vertices.tostring(), gl.GL_STATIC_DRAW)
	
	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				pygame.quit()
				quit()

		gl.glClear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT)
		
		# draw using VBO
		gl.glDrawArrays(gl.GL_QUADS, 0, 8);
		
		pygame.display.flip()
		pygame.time.wait(10)

if __name__ == '__main__':
	main()
LG
Antworten