【问题标题】:OpenGL ES 2.0 Object Picking on iOS (Using Color Coding)iOS 上的 OpenGL ES 2.0 对象拾取(使用颜色编码)
【发布时间】:2012-04-25 09:11:39
【问题描述】:

这可能显示为相关问题:

OpenGL ES 2.0 Object Picking on iOS

这说颜色选择器是一个很好的解决方案,并且在阅读后确实如此:

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

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

OpenGL ES color picking on the iPhone

不幸的是使用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);

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

感谢您的帮助。

【问题讨论】:

    标签: ios opengl-es-2.0


    【解决方案1】:

    实际上,我刚刚在我的 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];
    }
    

    希望这会有所帮助。

    【讨论】:

    • 如何写入这个帧缓冲区,但在同一个渲染循环中只显示另一个帧缓冲区?是不是像你绑定第一个缓冲区,绘制,读取颜色像素,然后绑定另一个,绘制,呈现到屏幕?你能给我看看这个代码吗?
    • 对不起,我不完全明白你想要做什么。您是否使用两个不同的缓冲区并在它们之间进行交换?您是否尝试设置延迟渲染器?例如,从着色器输出到渲染目标,以在另一个通道中使用?还是您只是想挑选颜色。
    • 我正在尝试在屏幕上渲染一些对象,但同时渲染相同的对象完全填充了某种颜色的“屏幕外”,这样当用户触摸屏幕时我可以调用读取“屏幕外”渲染上的像素方法并根据颜色我可以看到触摸了什么对象。
    • 我认为我成功渲染到 2 个不同的帧缓冲区,但我无法让您的功能正常工作。当用户触摸屏幕时,我想 NSLog 颜色(看它是否为绿色),我如何实现你的类方法?我猜,由于它在渲染周期之外,我必须绑定缓冲区,然后调用读取的像素,但是从它的 ubyte 开始我如何显示结果?
    • 好的,我想出了如何将它添加到我的代码中,谢谢。 (原来它只是一个整数)
    猜你喜欢
    • 2014-05-10
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多