2010-07-07 195 views
1

我想要在OpenGLES中完成一堆東西,但這裏是我開始的地方 - 將東西繪製到紋理,然後顯示該紋理。渲染到紋理仍渲染到OpenGLES中的屏幕

我創造了一些緩衝:

glGenFramebuffersOES(1, &frameBuffer); 
glGenRenderbuffersOES(1, &colorRenderbuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer); 

然後,我給自己定了畫一些線條的幀緩衝區。

glViewport(0, 0, backingWidth, backingHeight); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colours); 
glEnableClientState(GL_COLOR_ARRAY); 
glDrawArrays(GL_LINES, 0, 2000); 

然後,我嘗試將其複製到新制紋理中。

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, 128, 128); 

然後顯示紋理。

GLfloat vertices[] = {-1,1,1,1,-1,-1,1,-1}; 
GLfloat texcoords[] = { 0,1, 
          1,1, 
         0,0, 
         1,0,}; 

glColor4f(0.5, 0.5, 0.5, 0.1); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
GL_RENDERBUFFER_OES, colorRenderbuffer); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 
[context presentRenderbuffer:GL_FRAMEBUFFER_OES]; 

我所得到的是這樣的 - 在這意味着我的臺詞屏幕(我畫的三角形扇意味着我可以在後面看到的樣子)的「後退」顯示我的臺詞都被吸引到了渲染,儘管我從來沒有約束過它。最重要的是,我將我的紋理繪製成一些奇怪的顏色,而不是我預期的那樣。

所以,我有兩個問題在這裏:

爲什麼我的線仍然出現在如果我不寫他們的渲染屏幕的後面?

我是否正確寫入紋理?如果是這樣,爲什麼不顯示?

+1

您遺漏了很多重要的代碼,如glFramebuffer *電話(glFramebufferRenderbuffer等),但我真的不明白,就是如果你綁定的幀緩衝,這會使它,而不是屏幕。 另外,你爲什麼不使用FBO直接繪製紋理? – 2010-07-07 15:30:11

+0

FBO是FramebufferObject,對吧?你能詳細說明可能涉及的內容嗎?我已經在其他地方看到過這種情況,但沒有提供可靠的代碼。 關於渲染目標,這也正是我的問題。沒有理由爲什麼應該出現在屏幕上,但它是。仍然用更簡單的例子來處理它。 – mtrc 2010-07-07 15:37:16

+1

其實更好的問題是,你想要做什麼? – 2010-07-07 16:26:43

回答

2

你需要使用一個幀緩衝區對象(FBO)直接繪製到紋理,下面教程應該可以幫助您:

http://www.flashbang.se/archives/48

注意,這些教程是對OpenGL,支持OpenGL ES是相同,但EXT在大多數方法和枚舉中更改爲OES。

另請注意,綁定幀緩衝區(glBindFramebufferEXT/OES)會使所有渲染都轉到該幀緩衝區(以及它附加的紋理/渲染緩衝區),因此,在再次繪製屏幕之前需要先解除幀緩衝區的綁定, :

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
+0

我看過那篇教程。它很有意義,儘管他提供的代碼還沒有工作。我會堅持下去,謝謝你! – mtrc 2010-07-07 16:57:39