OpenGL pygame не может обеспечить надежную работу буферов с vertextPointer и colorPointerPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 OpenGL pygame не может обеспечить надежную работу буферов с vertextPointer и colorPointer

Сообщение Anonymous »

Поэтому я почти уверен, что делаю что-то не так с тем, как я вызываю OpenGL.
Я привел пример ниже, где примерно в 30% случаев он показывает полупрозрачную вершину. цветные квадраты на красном фоне. Остальные 70% времени отображается только красный фон. Я пробовал комментировать различные команды opengl, чтобы посмотреть, смогу ли я заставить их работать надежно. Это моя попытка создать «минимальный» воспроизводимый пример из гораздо более крупной программы.
Я пробовал добавлять координаты z к точкам и устанавливать GL_DEPTH_TEST, но это не имело никакого значения, все равно не работает. В 70 % случаев.
Как ни странно, иногда программа может работать через раз несколько раз, но, возможно, это просто совпадение.
Кроме того, когда он работает, он работает нормально и циклически меняет все цвета для разных квадратов, пока программа не завершится, поэтому это заставляет меня думать, что что-то не так с инициализацией, или какая-то гонка, или что-то в этом роде.
import OpenGL.GL as gl
import numpy as np
import pygame as pg
from pygame import locals as pg_locals
import time

class OpenGLWindow:
def __init__(self):
self.use_color_buffer = 0

flags = pg_locals.DOUBLEBUF | pg_locals.OPENGL | pg_locals.RESIZABLE
self.pg_window = pg.display.set_mode(
(800, 600),
flags,
vsync=1,
)

# gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE)
# gl.glEnable(gl.GL_DEPTH_TEST) # we are disabling this for now because the texture z depth and overlay elements aren't configured right yet.
gl.glEnable(gl.GL_BLEND)
gl.glEnable(gl.GL_COLOR_MATERIAL)
gl.glColorMaterial(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE)
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
# gl.glEnable(gl.GL_TEXTURE_2D)

# gl.glLoadIdentity()

self.setup_buffers_2()

def setup_buffers_2(self):
self._vertexBuffer = gl.glGenBuffers(1)
self._colorBuffers = gl.glGenBuffers(3)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._vertexBuffer)
vertices = np.array(
[0.5, 0.5, 0, 0.5, 0, 0, 0.5, 0, -0.5, -0.5, 0, -0.5, 0, 0, -0.5, 0],
dtype="float32",
)
gl.glBufferData(gl.GL_ARRAY_BUFFER, vertices, gl.GL_STATIC_DRAW) # Error
for n in range(3):
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._colorBuffers[n])
colors = []
for p in range(8):
for c in range(3):
colors.append((p % 4) * 0.25 if c == n else 0)
colors.append((p % 4) * 0.25)
print(colors)
gl.glBufferData(
gl.GL_ARRAY_BUFFER, np.array(colors, dtype="float32"), gl.GL_STATIC_DRAW
)

def cleanup_buffers_2(self):
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._vertexBuffer)
gl.glDeleteBuffers(1, self._vertexBuffer)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
for n in range(3):
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._colorBuffers[n])
gl.glDeleteBuffers(3, self._colorBuffers)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)

def render_opengl_2(self):
gl.glClearColor(1.0, 0.0, 0.0, 1.0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)

gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
gl.glEnableClientState(gl.GL_COLOR_ARRAY)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._vertexBuffer)
gl.glVertexPointer(2, gl.GL_FLOAT, 0, 0)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._colorBuffers[self.use_color_buffer])
gl.glColorPointer(4, gl.GL_FLOAT, 0, 0)
gl.glDrawArrays(gl.GL_QUADS, 0, 8)

pg.display.flip()

self.use_color_buffer += 1
self.use_color_buffer %= 3

window = OpenGLWindow()

# window.render_opengl_2()
# time.sleep(1)
# window.cleanup_buffers_2()

try:
for _ in range(30):
window.render_opengl_2()
time.sleep(0.1)
finally:
window.cleanup_buffers_2()


Подробнее здесь: https://stackoverflow.com/questions/783 ... and-colorp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»