glReadPixels在对象单击时不给出RGBA值

时间:2012-11-24 15:19:28

标签: opengl sdl

我正在尝试在我的应用程序中实现一些简单的对象选择,但从一开始就遇到问题。为了进行测试,我尝试使用本教程中给出的内容:OpenGL Programming/Object selection

在我的代码中,我现在执行以下操作:

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);

给我以下输出: 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值的原因吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

找到解决这个问题的方法......

在运行glReadPixels之前,它正在交换缓冲区。