2012-11-24 20 views
0

我試圖在我的應用程序中實現一些簡單的對象拾取,但從一開始就遇到問題。爲了測試我想用什麼在本教程中給出:OpenGL Programming/Object selectionglReadPixels不給對象點擊RGBA值

在我的代碼我現在做到以下幾點:

GLbyte color[4]; 
GLfloat depth; 
GLuint index; 
glReadPixels(click->x, WINDOW_HEIGHT - click->y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color); 
glReadPixels(click->x, WINDOW_HEIGHT - click->y - 1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); 
glReadPixels(click->x, WINDOW_HEIGHT - click->y - 1, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_INT, &index); 

printf("Clicked on pixel %d, %d, color %02hhx%02hhx%02hhx%02hhx, depth %f, stencil index %u\n", click->x, click->y, color[0], color[1], color[2], color[3], depth, index); 

這給我follwing輸出: output from program

沒有值爲RGBA或模板索引。我只有一個對象,我放了glStencilFunc(GL_ALWAYS, 99, -1);,所以我不希望看到大多數地方的模板索引。對於顏色,但我不認爲會有什麼額外的要求?

出於調試這裏是我的OGL初始化代碼的一些核心部件:

glEnable(GL_DEPTH_TEST); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_MULTISAMPLE); 

glEnable(GL_STENCIL_TEST); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

和SDL初始化代碼:

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); 
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); 
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); 
    window = SDL_CreateWindow(windowTitle.c_str(), SDL_WINDOWPOS_CENTERED, 
    SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); 

從這些信息是可以提取爲什麼我的glReadPixels沒有報告例如RGBA值?

回答

0
glReadPixels(click->x, WINDOW_HEIGHT - click->y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color); 

你錯過了一個&

glReadPixels(click->x, WINDOW_HEIGHT - click->y - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color); 
+0

顏色被定義爲'GLbyte顏色[4];',無論如何,這並沒有什麼區別... – toeplitz

+0

夠公平的。儘管你應該提到*如何定義顏色。 –

0

找到了解決這個問題...

它運行在glReadPixels之前交換緩衝區。