2010-10-27 161 views

回答

29

即使你使用的是Android,我創建了一個iPhone示例應用程序對於進入的視頻幀,請執行此操作。您可以從here下載此示例的代碼。我有一個關於這個應用程序的寫法,它使用實時視頻進行基於顏色的對象跟蹤,您可以閱讀here

在本申請中,我繪製兩個三角形,以產生一個矩形,則質地使用以下座標:

static const GLfloat squareVertices[] = { 
     -1.0f, -1.0f, 
     1.0f, -1.0f, 
     -1.0f, 1.0f, 
     1.0f, 1.0f, 
    }; 

    static const GLfloat textureVertices[] = { 
     1.0f, 1.0f, 
     1.0f, 0.0f, 
     0.0f, 1.0f, 
     0.0f, 0.0f, 
    }; 

穿過視頻幀作爲紋理,我使用一個簡單的程序使用以下頂點着色器:

attribute vec4 position; 
attribute vec4 inputTextureCoordinate; 

varying vec2 textureCoordinate; 

void main() 
{ 
    gl_Position = position; 
    textureCoordinate = inputTextureCoordinate.xy; 
} 

和以下片段着色器:

varying highp vec2 textureCoordinate; 

uniform sampler2D videoFrame; 

void main() 
{ 
    gl_FragColor = texture2D(videoFrame, textureCoordinate); 
} 

繪圖是使用正確的程序的一個簡單的事情:

glUseProgram(directDisplayProgram); 

設置質地均勻:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, videoFrameTexture); 

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0); 

設置屬性:

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); 
glEnableVertexAttribArray(ATTRIB_VERTEX); 
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices); 
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON); 

,然後繪製三角形:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
+2

請記住,您需要更改屬性索引 - 這是在您的示例程序中完成的,而不是在帖子中完成。 '//屬性索引。 枚舉{ ATTRIB_VERTEX, ATTRIB_COLOR, ATTRIB_TEXTUREPOSITON, NUM_ATTRIBUTES };' – appas 2011-03-31 06:02:58

+0

什麼你這是@dep是什麼意思? – kevlar 2012-02-27 07:51:22

+0

你的應用需要一些更新。有一些棄用的功能,它墜毀在ios 8上。 但是我喜歡它:-) – Karsten 2014-07-29 11:57:58

13

您並不真正繪製背景,而是繪製一個矩形(或者,更準確地說:形成矩形的兩個三角形)並設置紋理。這與在屏幕上繪製任何其他對象完全不同。

有很多地方顯示如何做到這一點,也許甚至有一個Android示例項目顯示了這一點。

棘手的部分是讓東西顯示在別的前面或後面。爲此,您需要設置深度緩衝區並啓用深度測試(glEnable(GL_DEPTH_TEST))。你的頂點需要有一個Z座標(並告訴glDrawElements你的頂點由三個值組成,而不是兩個)。

如果你不這樣做,對象將在其glDrawElements()函數被調用(這意味着無論你得出最後會落得模糊的其餘部分)的順序進行渲染。

我的建議是沒有背景圖片或做任何幻想,直到你得到它的竅門。 OpenGL ES 2.0的有怎樣的一個陡峭的學習曲線,並在ES 1.x的教程真的不與得到的3D合作,因爲他們可以使用的輔助功能,如gluPerspective,其2.0只是沒有幫助。開始創建一個沒有任何背景的三角形。接下來,讓它成爲一個正方形。然後,如果你想要看起來很漂亮,那麼添加一個紋理。玩位置。看看當你改變頂點的Z值時會發生什麼。 (提示:不是很多,如果你沒有啓用深度測試。即使如此,如果你沒有透視投影,物體不會越遠離他們越遠,所以它仍然會看起來好像什麼也沒有發生)

幾天後,它停止了這麼該死的挫折,最後你終於「明白了」。