Próbuję wyrenderować teksturę, a następnie narysować tę teksturę na ekranie przy użyciu OpenGL ES na iPhonie. Używam this question jako punktu wyjścia i robię rysunek w podklasie demona Apple EAGLView.OpenGL ES render do tekstury, a następnie narysuj teksturę
Zmienne instancji:
GLuint textureFrameBuffer;
Texture2D * texture;
aby zainicjować bufor ramki i tekstury, robię to:
GLint oldFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO);
// initWithData results in a white image on the device (works fine in the simulator)
texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"blank320.png"]];
// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
NSLog(@"incomplete");
glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO);
Teraz, jeśli po prostu narysować moją scenę na ekranie, jak zwykle, działa dobrze:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw some triangles, complete with vertex normals
[contentDelegate draw];
[self swapBuffers];
Ale jeśli odda „textureFrameBuffer”, a następnie „texture” rysować na ekranie, otrzymany im wiek jest do góry nogami i "na wylot". Oznacza to, że wygląda tak, jakby obiekty 3D były skierowane do wewnątrz, a nie na zewnątrz - przednia powierzchnia każdego obiektu jest przezroczysta i widzę wnętrze tylnej ściany. Oto kod:
GLint oldFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw some polygons
[contentDelegate draw];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glColor4f(1, 1, 1, 1);
[texture drawInRect:CGRectMake(0, 0, 320, 480)];
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
[self swapBuffers];
mogę odwrócić obraz w normalnym położeniu dość łatwo poprzez reorganizację (glTexCoordPointer) koordynuje odpowiednio (w metodzie Texture2D za drawInRect), ale to nie rozwiązuje „inside-out” problemu.
Próbowałem zastąpić teksturę Texture2D ręcznie utworzoną teksturą OpenGL, a wynik był taki sam. Rysowanie Texture2D załadowanego z obrazu PNG działa dobrze.
Jeśli chodzi o rysowanie obiektów, każdy wierzchołek ma określoną normalną jednostkę i włączono GL_NORMALIZE
.
glVertexPointer(3, GL_FLOAT, 0, myVerts);
glNormalPointer(GL_FLOAT, 0, myNormals);
glDrawArrays(GL_TRIANGLES, 0, numVerts);
Wszystko rysuje się dobrze, gdy jest renderowane na ekranie; GL_DEPTH_TEST
jest włączony i działa świetnie.
Wszelkie sugestie, jak to naprawić? Dzięki!
Jeśli chodzi o problem "inside-out": jeśli twoje prymitywy skierowane do przodu są poddane ubojowi, masz problem z porządkowaniem wierzchołków, który jest używany do określenia aspektu normalnego. To nie jest problem z teksturowaniem, chyba że coś nie rozumiem. Czy masz włączoną obsługę GL_CULL_FACE? – prideout
GL_CULL_FACE nie został włączony. Włączenie go zdecydowanie poprawia ogólny wygląd. Obiekt normalny wydaje się teraz właściwą drogą, ale wiele przednich twarzy, które powinny być ukryte, jest teraz widocznych, niezależnie od tego, czy są (a raczej powinny być) zasłonięte przez inną twarz. Czy to oznacza problem z uzwojeniem moich trójkątów? Używam skryptu do eksportu wierzchołków z Blendera; Upewnię się, że uzwojenie jest jednolite po wyeksportowaniu. Pamiętaj, że wszystko wygląda idealnie, gdy rysuję bezpośrednio na ekranie (a GL_CULL_FACE jest włączone lub wyłączone nie ma znaczenia). –