[英]OpenGL ES 2.0 Object Picking on iOS (Using Color Coding)
这可能显示为一个相关问题:
其中说“拾色器”是一个很好的解决方案,并且在阅读了有关内容后,实际上就是这样:
http://www.lighthouse3d.com/opengl/picking/index.php?color1
这似乎是一个非常简单的解决方案,所以这使我想到了这个问题
不幸的是,它使用的是opengl es 1.0,我试图在2.0中使用它,因此我无法访问该问题中描述的功能。
但是理论似乎很简单,这就是我应该做的:
触摸时,我用一种独特的颜色渲染对象。
在触摸结束时,我从该位置获取像素并检查其颜色以获取对象。 (可能使用glReadPixels)
问题是我不知道如何执行“渲染到后台缓冲区并从中读取”。
到目前为止,我的代码仅使用“ Draw”,我怀疑我必须做类似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);
我已经删除了图纸计算,以使其更易于理解。 关键是我看不到我在哪里指定“我在哪里绘制”。
谢谢你的帮助。
我实际上已经完成了使用openGL ES 2.0在我的iPhone游戏中实现拾色功能的过程,并且使用了有趣的灯塔教程。
您应该绘制到帧缓冲区。
如果您想从帧缓冲区中读取数据,那是正确的,因为您想使用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];
}
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.