我剛剛開始使用OpenGL ES 2.0,我想要做的是創建一些簡單的2D輸出。鑑於480x800的分辨率,我如何繪製背景紋理?如何在OpenGL ES 2.0中將紋理繪製爲2D背景?
[我的開發環境是java/Android的,所以直接關係到的例子是最好的,但其他語言就可以了。]
我剛剛開始使用OpenGL ES 2.0,我想要做的是創建一些簡單的2D輸出。鑑於480x800的分辨率,我如何繪製背景紋理?如何在OpenGL ES 2.0中將紋理繪製爲2D背景?
[我的開發環境是java/Android的,所以直接關係到的例子是最好的,但其他語言就可以了。]
即使你使用的是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);
您並不真正繪製背景,而是繪製一個矩形(或者,更準確地說:形成矩形的兩個三角形)並設置紋理。這與在屏幕上繪製任何其他對象完全不同。
有很多地方顯示如何做到這一點,也許甚至有一個Android示例項目顯示了這一點。
棘手的部分是讓東西顯示在別的前面或後面。爲此,您需要設置深度緩衝區並啓用深度測試(glEnable(GL_DEPTH_TEST))。你的頂點需要有一個Z座標(並告訴glDrawElements你的頂點由三個值組成,而不是兩個)。
如果你不這樣做,對象將在其glDrawElements()函數被調用(這意味着無論你得出最後會落得模糊的其餘部分)的順序進行渲染。
我的建議是沒有背景圖片或做任何幻想,直到你得到它的竅門。 OpenGL ES 2.0的有怎樣的一個陡峭的學習曲線,並在ES 1.x的教程真的不與得到的3D合作,因爲他們可以使用的輔助功能,如gluPerspective,其2.0只是沒有幫助。開始創建一個沒有任何背景的三角形。接下來,讓它成爲一個正方形。然後,如果你想要看起來很漂亮,那麼添加一個紋理。玩位置。看看當你改變頂點的Z值時會發生什麼。 (提示:不是很多,如果你沒有啓用深度測試。即使如此,如果你沒有透視投影,物體不會越遠離他們越遠,所以它仍然會看起來好像什麼也沒有發生)
幾天後,它停止了這麼該死的挫折,最後你終於「明白了」。
請記住,您需要更改屬性索引 - 這是在您的示例程序中完成的,而不是在帖子中完成。 '//屬性索引。 枚舉{ ATTRIB_VERTEX, ATTRIB_COLOR, ATTRIB_TEXTUREPOSITON, NUM_ATTRIBUTES };' – appas 2011-03-31 06:02:58
什麼你這是@dep是什麼意思? – kevlar 2012-02-27 07:51:22
你的應用需要一些更新。有一些棄用的功能,它墜毀在ios 8上。 但是我喜歡它:-) – Karsten 2014-07-29 11:57:58