PyopenGL glReadPixels

时间:2015-04-25 23:00:00

标签: python opengl pyopengl

我尝试使用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 我该如何解决?

1 个答案:

答案 0 :(得分:0)

你的主要问题是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

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