【问题标题】:PyopenGL glReadPixelsPyopenGL glReadPixels
【发布时间】:2020-12-25 20:56:17
【问题描述】:

我尝试使用 glReadPixels 方法在屏幕上对一个简单的三角形进行颜色编码,只是没有任何辅助渲染功能等,但它没有给出好的结果。代码:

import pygame as pg
from OpenGL.GL import *


pg.display.set_mode((500,500),pg.OPENGL)
glClearColor(0.5,0.0,0.5,0.0)
done=0

def first():
    glColor3f(0.5,0.6,0.7)
    glBegin(GL_TRIANGLES)
    glVertex(0.0,0.0,0.0)
    glVertex(1.0,0.0,0.0)
    glVertex(0.0,1.0,0.0)
    glEnd()
cl=0
clock=pg.time.Clock()
while not done:
    for event in pg.event.get():
        if event.type==pg.QUIT: done=1
        elif event.type==pg.MOUSEBUTTONDOWN:
            pos=pg.mouse.get_pos()
            color=glReadPixels(pos[0],pos[1],1,1,GL_RGB,GL_FLOAT)
            print color, pos[0], pos[1])



    glClear(GL_COLOR_BUFFER_BIT)
    first()
    pg.display.flip()
    clock.tick(20)
pg.quit()

但它总是给出相同的颜色输出: [[[ 0.50196081 0. 0.50196081]]] 288 217 我该如何解决?

【问题讨论】:

  • 据我从代码中可以看出,您正在读回后台缓冲区的内容,此时 未定义。我不知道 pygame 的 mouse.get_pos() 应该如何工作,但我怀疑它没有返回正确的 OpenGL 窗口坐标与底角的原点。从给出的数字来看,在 500x500 的窗口上,假设身份转换和完整的视口,(288,217) 只是背景,根本不在三角形中。

标签: python opengl pyopengl


【解决方案1】:

您的主要问题是 glReadPixels 接受左下角的原点,而 pygame 给出左上角的原点。

首先,您应该始终保存您的 pygame Surface(原因我将很快演示)。所以:

window = pg.display.set_mode((500,500),pg.OPENGL)

现在您可以访问window.widthwindow.height。所以现在你的glReadPixels 将得到正确的位置:

color=glReadPixels(x,window.height-y,1,1,GL_RGB,GL_FLOAT)

PS:如果你确实想要最新颜色,你应该把你的颜色检测放在first()之后但在pg.display.flip()之前(OpenGL总是绑定到后台缓冲区(除非你是以其他方式指定(但您不想)))

编辑:pg,而不是 py

编辑:我错了,它以像素为单位。我的错。

【讨论】:

  • 谢谢!但是告诉我,为什么这些返回的颜色与我描述的glClearColorglColor 的颜色值不一样?
  • 这是一个好问题... pygame 会自动清除后台缓冲区吗?可能是因为您正在从后台缓冲区读取数据,所以您的内存是空的。 (见我的“PS”)
猜你喜欢
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多