PyopenGL glReadPixels

Я попытался использовать метод 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 Как я могу это исправить?


person Sasszem    schedule 25.04.2015    source источник
comment
Насколько я вижу из кода, вы считываете содержимое обратного буфера, которое в данный момент не определено. Я не знаю, как должен работать mouse.get_pos() pygame, но я подозреваю, что он не возвращает правильные координаты окон OpenGL с исходной точкой в ​​​​нижнем углу чердака. Из приведенных чисел в окне 500x500 и при условии преобразования идентичности и полного окна просмотра (288 217) — это просто фон, а не треугольник.   -  person derhass    schedule 26.04.2015


Ответы (1)


Ваша основная проблема заключается в том, что glReadPixels принимает нижнее левое происхождение и pygame дает верхний левый.

Во-первых, вы всегда должны сохранять свою pygame Surface (по причине, которую я скоро продемонстрирую). Так:

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

Теперь вы можете получить доступ к window.width и window.height. Итак, теперь ваш glReadPixels займет свое место:

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

PS: Если вам нужен самый последний цвет, вы должны просто поместить обнаружение цвета после first(), но до pg.display.flip() (OpenGL всегда привязан к заднему буферу (если вы не указали иное (но вы бы не хочу)))

РЕДАКТИРОВАТЬ: пг, а не ру

РЕДАКТИРОВАТЬ: я ошибался, это в пикселях. Виноват.

person Cosine    schedule 26.04.2015
comment
Спасибо! Но скажите мне, почему эти возвращенные цвета не совпадают со значениями цвета, которые я описал для glClearColor и glColor? - person Sasszem; 28.04.2015
comment
Это хороший вопрос... очищает ли pygame автоматически задний буфер? Возможно, поскольку вы читаете из своего заднего буфера, вы получаете пустую память. (Смотри мой ПС) - person Cosine; 30.04.2015