iOS上的OpenGL ES 2.0对象拾取(使用颜色编码)

这可能是一个相关的问题:

iOS上的OpenGL ES 2.0对象拾取

哪个说颜色select器是一个很好的解决scheme,并在阅读后的行动:

http://www.lighthouse3d.com/opengl/picking/index.php?color1

这似乎是一个非常简单的解决scheme,所以这使我想到了这个问题

在iPhone上的OpenGL ES颜色select

不幸的是使用opengl es 1.0,我想在2.0中做到这一点,所以我没有访问该问题中描述的function。

但是这个理论看起来很简单,我想我应该这样做:

触摸开始,我用独特的颜色呈现我的对象。

触摸结束时,我从该位置获取像素,并检查它的颜色来获取我的对象。 (可能与glReadPixels)

问题是我不知道如何做“渲染到后台缓冲区并从中读取”。

我的代码到目前为止只是使用“绘制”,我怀疑我不得不做一些像glBind 另一个缓冲区,但我将不胜感激一些帮助。

我的绘图代码是这样的:

glClearColor(0, 0, 0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // Set the Projection Matrix GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(60), 2.0/3.0, 0, 50); glUseProgram(_programHD); glBindVertexArrayOES(_vao); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _textureBuffer[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glUniform1i(uniforms[UNIFORM_TEXTURE_HD], 1); // Drawing starts here // // Pass the Model View Matrix to Open GL _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix,rotationMatrix); glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX_HD], 1, GL_FALSE, _modelViewProjectionMatrix.m); // Change texture coordinates to draw a different image glUniform2fv(uniforms[TEXTURE_OFFSET_HD], 1, offSet.v); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); //glUniform2i(uniforms[TEXTURE_OFFSET], 7, -5); glUniform2fv(uniforms[TEXTURE_OFFSET_HD], 1, borderHD.v); glDrawElements(GL_LINE_STRIP, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArrayOES(0); glUseProgram(0); 

我已经剥离了绘图计算,使其更容易理解。 关键是我没有看到我指定的地方“我在哪里”画画。

谢谢你的帮助。

我其实刚刚完成了一个颜色selectfunction到我的iPhone游戏,使用OpenGL ES 2.0,使用有趣的灯塔教程。

您应该绘制到帧缓冲区。

如果你想从帧缓冲区读取,那么你是正确的,你想使用glReadPixels。 更多信息在这里:

http://www.opengl.org/sdk/docs/man/xhtml/glReadPixels.xml

唯一不同于灯塔教程的是你也想存储alpha值。 这里有一个快速的函数来获取特定像素的颜色。 随意改善或改变它,但它做的工作。

 + (void) ProcessColourPick : (GLubyte*) out : (Float32) x : (Float32) y { GLint viewport[4]; //Get size of screen glGetIntegerv(GL_VIEWPORT,viewport); GLubyte pixel[4]; //Read pixel from a specific point glReadPixels(x,viewport[3] - y,1,1, GL_RGBA,GL_UNSIGNED_BYTE,(void *)pixel); out[0] = pixel[0]; out[1] = pixel[1]; out[2] = pixel[2]; out[3] = pixel[3]; } 

希望这可以帮助。