2015-04-25 3 views
0

Я попытался использовать метод glReadPixels для цветового кода простого треугольника на экране, без каких-либо дополнительных функций рендеринга и т. Д., Но это не дало хорошего результата. Код: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,50196081 0.]]] 288 217 Как я могу это исправить?

+0

Насколько я могу видеть из кода, вы читаете содержимое заднего буфера, который _undefined_ на данный момент времени. Я не знаю, как должен работать pygame 'mouse.get_pos()', но я подозреваю, что он не возвращает правильные координаты окон OpenGL с началом в нижнем углу лофта. Из приведенных чисел, в окне 500x500 и при принятии преобразований идентичности и полного окна просмотра (288,217) является только фоном, а не треугольником. – derhass

ответ

0

Ваша основная проблема заключается в том, что 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 всегда привязан к спине буфер (если вы не должны были указать в противном случае (но вы не хотите)))

EDIT: пг, не ру

EDIT: Я был неправ, это в пикселях. Виноват.

+0

Спасибо! Но скажите, почему эти возвращенные цвета не совпадают с значениями цвета, которые я описал как «glClearColor» и «glColor»? – Sasszem

+0

Это хороший вопрос ... может ли pygame автоматически очистить задний буфер? Возможно, потому что вы читаете из своего заднего буфера, вы получаете пустую память. (См. Мой «PS») – Cosine