Opengl glReadPixels在单击对象时不提供RGBA值
我试图在我的应用程序中实现一些简单的对象拾取,但从一开始就遇到了问题。对于测试,我尝试使用本教程中给出的内容: 在我的代码中,我现在执行以下操作:Opengl glReadPixels在单击对象时不提供RGBA值,opengl,sdl,Opengl,Sdl,我试图在我的应用程序中实现一些简单的对象拾取,但从一开始就遇到了问题。对于测试,我尝试使用本教程中给出的内容: 在我的代码中,我现在执行以下操作: 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, WIND
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);
这给了我以下输出:
RGBA或模具索引没有值。我只有一个对象,其中我放置了glStencilFunc(GL_总是,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_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);
和SDL初始化代码:
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_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);
从该信息中是否可以提取myglReadPixels
不报告例如RGBA值的原因
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);
找到了这个问题的解决方案
在运行glReadPixels
颜色定义为GLbyte颜色[4]之前,它正在交换缓冲区代码>,无论如何,这并没有什么不同…足够公平。尽管您应该提到颜色是如何定义的。