[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: 13100
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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