2015-04-25 56 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 0.50196081]]] 288 217 我怎樣才能解決這個問題?

+0

據我可以看到從代碼中,您正在讀回back buffer的這個_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.widthwindow.height。所以,現在你glReadPixels將得到適當的位置:

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

PS:如果你想最近顏色,你應該只是把你的膚色檢測first()之後,但在pg.display.flip()(OpenGL的總是綁定到回緩衝區(除非你指定,否則(但你不會想)))

編輯:PG,不PY

編輯:我錯了,它以像素爲單位。我的錯。

+0

謝謝!但告訴我,爲什麼這些返回的顏色與我描述的「glClearColor」和「glColor」的顏色值不一樣? – Sasszem

+0

這是一個很好的問題...... pygame會自動清除後臺緩衝區嗎?這可能是因爲你正在從你的後臺緩衝區中讀取,你會得到空的內存。 (見我的「PS」) – Cosine