我如何在 pyopengl 中使用函数 glDrawnPixels?
How do i use the function glDrawnPixels in pyopengl?
所以我正在研究基于体素的引擎,目前我正在从 tkinter 的 canvas 更改为 PyOpenGl。我找到了对我的引擎非常重要的函数 glDrawnPixels。但这就是问题所在,我不太了解 OpenGL 或 PyOpenGl,而且我的试探性销售是黑色像素。那么我该怎么做才能拥有不同颜色的像素。
这也是我的尝试:
import glfw
from OpenGL.GL import *
import numpy as np
import pyrr
buffer = bytearray(800 * 600 * 3)
display = (800,600)
if not glfw.init():
raise Exception("glfw can not be initialized!")
def CreateWindow(title="Baguette game",width=1280,height=750):
display = (width,height)
buffer = bytearray(width * height * 3)
window = glfw.create_window(width,height,title, None, None)
glfw.set_window_pos(window,400,200)
glfw.make_context_current(window)
return window
def DrawTriangle(pointA=[-0.5, -0.5, 0.0],pointB=[0.5, -0.5,0.0],
pointC=[-0.5, 0, 0.0],color=[1.0,0,0]):
vertices = [pointA[0], pointA[1], pointA[2],
pointB[0], pointB[1], pointB[2],
pointC[0], pointC[1], pointC[2]]
colors = [color[0], color[1], color[2],
color[0], color[1], color[2],
color[0], color[1], color[2] ]
v = np.array(vertices,dtype=np.float32)
c = np.array(colors, dtype=np.float32)
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT,0,v)
glEnableClientState(GL_COLOR_ARRAY)
glColorPointer(3, GL_FLOAT,0,c)
glDrawArrays(GL_TRIANGLES,0,3)
if __name__=="__main__":
window = CreateWindow()
initialPosition = (0,0,0)
z=1
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT)
DrawTriangle([-0.5, -0.5, z],[0.5, -0.5,z],[-0.5, 0, z])
glDrawPixels(display[1], display[0], GL_RGB, GL_UNSIGNED_BYTE, buffer)
DrawTriangle([-0.5, 0.5, z],[0.5, 0.5,z],[-0.5, 1, z])
glfw.swap_buffers(window)
glfw.terminate()
在屏幕中央可以看到一个被黑色像素切割的三角形,在整个三角形的上方。
您可以在带有 pyopengltk. An example can be found here: tkinter_opengl_shader_ctypes_glm_meshes.py 的 tkinter 框架中使用 OpenGL/PyOpenGL。
glDrawPixels
is deprecated, do not use it. Render primitives instead. See Primitive.
无论如何,您需要在缓冲区中设置颜色日期(如评论中所建议)。例如:
buffer = bytearray(800 * 600 * 3)
display = (1280, 750)
buffer_data = [255, 128, 0] * (display[0] * display[1])
buffer = (GLubyte * (display[0] * display[1] * 3))(*buffer_data)
glDrawPixels(display[1], display[0], GL_RGB, GL_UNSIGNED_BYTE, buffer)
glDrawPixels(display[0], display[1], GL_RGB, GL_UNSIGNED_BYTE, buffer)
但是,如果您只想为显示设置清晰的颜色,请使用glClearColor
:
glClearColor(1, 0.5, 0, 1)
glClear(GL_COLOR_BUFFER_BIT)
可以使用glReadPixels
从帧缓冲区中读回颜色:
color = glReadPixels(0, 0, display[0], display[1], GL_RGB, GL_UNSIGNED_BYTE, outputType='raw')
所以我正在研究基于体素的引擎,目前我正在从 tkinter 的 canvas 更改为 PyOpenGl。我找到了对我的引擎非常重要的函数 glDrawnPixels。但这就是问题所在,我不太了解 OpenGL 或 PyOpenGl,而且我的试探性销售是黑色像素。那么我该怎么做才能拥有不同颜色的像素。
这也是我的尝试:
import glfw
from OpenGL.GL import *
import numpy as np
import pyrr
buffer = bytearray(800 * 600 * 3)
display = (800,600)
if not glfw.init():
raise Exception("glfw can not be initialized!")
def CreateWindow(title="Baguette game",width=1280,height=750):
display = (width,height)
buffer = bytearray(width * height * 3)
window = glfw.create_window(width,height,title, None, None)
glfw.set_window_pos(window,400,200)
glfw.make_context_current(window)
return window
def DrawTriangle(pointA=[-0.5, -0.5, 0.0],pointB=[0.5, -0.5,0.0],
pointC=[-0.5, 0, 0.0],color=[1.0,0,0]):
vertices = [pointA[0], pointA[1], pointA[2],
pointB[0], pointB[1], pointB[2],
pointC[0], pointC[1], pointC[2]]
colors = [color[0], color[1], color[2],
color[0], color[1], color[2],
color[0], color[1], color[2] ]
v = np.array(vertices,dtype=np.float32)
c = np.array(colors, dtype=np.float32)
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT,0,v)
glEnableClientState(GL_COLOR_ARRAY)
glColorPointer(3, GL_FLOAT,0,c)
glDrawArrays(GL_TRIANGLES,0,3)
if __name__=="__main__":
window = CreateWindow()
initialPosition = (0,0,0)
z=1
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT)
DrawTriangle([-0.5, -0.5, z],[0.5, -0.5,z],[-0.5, 0, z])
glDrawPixels(display[1], display[0], GL_RGB, GL_UNSIGNED_BYTE, buffer)
DrawTriangle([-0.5, 0.5, z],[0.5, 0.5,z],[-0.5, 1, z])
glfw.swap_buffers(window)
glfw.terminate()
在屏幕中央可以看到一个被黑色像素切割的三角形,在整个三角形的上方。
您可以在带有 pyopengltk. An example can be found here: tkinter_opengl_shader_ctypes_glm_meshes.py 的 tkinter 框架中使用 OpenGL/PyOpenGL。
glDrawPixels
is deprecated, do not use it. Render primitives instead. See Primitive.
无论如何,您需要在缓冲区中设置颜色日期(如评论中所建议)。例如:
buffer = bytearray(800 * 600 * 3)
display = (1280, 750)
buffer_data = [255, 128, 0] * (display[0] * display[1])
buffer = (GLubyte * (display[0] * display[1] * 3))(*buffer_data)
glDrawPixels(display[1], display[0], GL_RGB, GL_UNSIGNED_BYTE, buffer)
glDrawPixels(display[0], display[1], GL_RGB, GL_UNSIGNED_BYTE, buffer)
但是,如果您只想为显示设置清晰的颜色,请使用glClearColor
:
glClearColor(1, 0.5, 0, 1)
glClear(GL_COLOR_BUFFER_BIT)
可以使用glReadPixels
从帧缓冲区中读回颜色:
color = glReadPixels(0, 0, display[0], display[1], GL_RGB, GL_UNSIGNED_BYTE, outputType='raw')