2012-04-25 93 views
1

這可能會出現一個相關的問題:OpenGL ES 2.0的對象採摘在iOS(使用顏色編碼)

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)

問題是,我不知道如何做「渲染到後臺緩衝區並從中讀取」。

我的代碼到目前爲止只是使用「繪製」,我懷疑我不得不做一些像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); 

我已經剝離了圖紙計算,以使其更容易理解。 重點是我沒有看到任何地方,我指定「我在哪裏」繪圖。

感謝您的幫助。

回答

0

我其實剛剛完成了一個顏色採摘功能到我的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]; 
} 

希望這會有所幫助。

+0

你如何寫入這個幀緩衝區,但在同一個渲染循環中只顯示其他幀緩衝區?是否像你這樣綁定第一個緩衝區,繪製,讀取顏色像素,然後綁定另一個,繪製,呈現給屏幕?你能告訴我這個代碼嗎? – Pochi 2012-04-27 00:49:57

+0

對不起,我不完全明白你想要做什麼。你使用兩種不同的緩衝區並在它們之間交換? 您是否嘗試設置延遲渲染器?如從中,從着色器輸出到渲染目標,在另一個通道中使用? 或者你只是試圖挑選顏色。 – Ben 2012-04-27 02:18:48

+0

我想在屏幕上渲染一些對象,但同時呈現完全充滿特定顏色的「屏幕外」的相同對象,以便當用戶觸摸屏幕時,我可以在屏幕外調用讀取像素方法「渲染和基於顏色我可以看到什麼對象被觸摸。 – Pochi 2012-04-27 02:35:17