3

深度と正しい遠近法をサポートするために、フレームバッファを適切にセットアップしようとしています。XCode で OpenGL ES アプリケーション テンプレートを使用しており、OpenGL ES Programming Guideのガイドラインに従っています。

FFP を使用して深さのあるレンダリングを取得したいだけなので、レンダラーを手動で ES1 に設定しています。

これは私の現在のコードです:


#import "ES1Renderer.h"
#import "water.h"
//#import "EAGLError.h"
#define PRINT_GLERR(error) ((error == GL_NO_ERROR) ? NSLog(@"No error") : NSLog(@"GL Error: %d", (error)))
//#define GLE(X) {X; eglGetError(); }

@implementation ES1Renderer

// Create an OpenGL ES 1.1 context
- (id)init
{
    if ((self = [super init]))
    {
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

        if (!context || ![EAGLContext setCurrentContext:context])
        {
            [self release];
            return nil;
        }

  glGenFramebuffersOES(1, &framebuffer);
  glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

  glGenRenderbuffersOES(1, &colorRenderbuffer);
  glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
  glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);


  glViewport(0, 0, backingWidth, backingHeight);

  // Start in projection mode.
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  double xmin, xmax, ymin, ymax;
  ymax = NEAR_PLANE * tanf(DEGREES_TO_RADIANS(FOV) / 2.0f);
  ymin = -ymax;
  xmin = ymin * ((float)backingWidth / (float)backingHeight);
  xmax = ymax * ((float)backingWidth / (float)backingHeight);
  glFrustumf(xmin, xmax, ymin, ymax, NEAR_PLANE, FAR_PLANE);
  glViewport(0, 0, backingWidth, backingHeight);

  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LESS);
  glDepthRangef(0.0f, 1.0f);
  glDepthMask(TRUE);
     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
    }

    return self;
}

- (void)render
{
    static const GLfloat squareVertices[] = {
        -0.5f,  -0.33f, -1.0f,
  0.5f,  -0.33f, -1.0f,
        -0.5f,   0.33f, -1.0f,
  0.5f,   0.33f, -1.0f,
    };

    static const GLubyte squareColors[] = {
        255, 255,   0, 255,
        0,   255, 255, 255,
        0,     0,   0,   0,
        255,   0, 255, 255,
    };

    static float transY = 0.0f;

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f);
    transY += 0.075f;

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glVertexPointer(3, GL_FLOAT, 0, squareVertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer
{
 glGenFramebuffersOES(1, &framebuffer);
 glGenRenderbuffersOES(1, &colorRenderbuffer);

 glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
 glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

 [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];
 glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

 glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
 glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

 glGenRenderbuffersOES(1, &depthRenderbuffer);
 glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
 glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
 glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

 if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
 {
  NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
  return NO;
 }

 return YES;
}

- (void)dealloc
{
    if (framebuffer)
    {
        glDeleteFramebuffersOES(1, &framebuffer);
        framebuffer = 0;
    }

    if (colorRenderbuffer)
    {
        glDeleteRenderbuffersOES(1, &colorRenderbuffer);
        colorRenderbuffer = 0;
    }

 if (depthRenderbuffer) 
 {
  glDeleteRenderbuffersOES(1, &depthRenderbuffer);
  depthRenderbuffer = 0;
 }

    if ([EAGLContext currentContext] == context)
        [EAGLContext setCurrentContext:nil];

    [context release];
    context = nil;

    [super dealloc];
}

@end

コードのこの部分を賞賛すると、次のようになります。


glGenRenderbuffersOES(1, &depthRenderbuffer);
 glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
 glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
 glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

上下に跳ね返って正しくレンダリングされるクワッドが得られます。深さの問題に関するヘルプは素晴らしいでしょう!

4

0 に答える 0