OpenGL ES iPhone, поврежденное изображение при использовании glClearColor - PullRequest
1 голос
/ 24 февраля 2012

Я только начинаю узнавать об OpenGL ES на iPhone. Я пытаюсь получить очень простой пример работы, который устанавливает EAGLContext и буфер рендеринга, а затем просто использует glClearColor для установки цвета экрана.

Мой код компилируется и выполняется, но, к сожалению, вместо ожидаемого серого экрана я вижу белое изображение со случайным шаблоном искажения. Я предполагаю, что я не все правильно настроил, и надеюсь, что моя ошибка будет очевидна для кого-то с небольшим опытом в этой области.

Мой код:

AppDelegate.h

#import "GLView.h"
#import <UIKit/UIKit.h>

@interface AppDelegate : NSObject <UIApplicationDelegate> {
@private
  UIWindow* m_window;
  GLView* m_view;
}

@end

AppDelegate.m

#import "AppDelegate.h"
#import "AppDelegate.h"
#import "GLView.h"

@implementation AppDelegate

- (void) applicationDidFinishLaunching: (UIApplication*) application
{
  CGRect screenBounds = [[UIScreen mainScreen] bounds];

  m_window = [[UIWindow alloc] initWithFrame: screenBounds];
  m_view = [[GLView alloc] initWithFrame: screenBounds];

  [m_window addSubview: m_view];
  [m_window makeKeyAndVisible];
}

- (void) dealloc
{
  [m_view release];
  [m_window release];
  [super dealloc];
}

@end

GLView.h

#import <QuartzCore/QuartzCore.h>

@interface GLView : UIView {
@private
  EAGLContext* m_context;

}

- (void) drawView;

@end

GLView.mm

#include <OpenGLES/ES1/gl.h>
#include <OpenGLES/ES1/glext.h>
#import "GLView.h"

@implementation GLView

+ (Class) layerClass
{
  return [CAEAGLLayer class];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

      //Set up the layer and context
      CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer;
      eaglLayer.opaque = YES;

      m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

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

      // Create & bind the color buffer so that the caller can allocate its space.
      GLuint renderbuffer;
      glGenRenderbuffersOES(1, &renderbuffer);
      glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
      [m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];
      glViewport(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));

      [self drawView];

    }
    return self;
}

- (void)drawView
{
  glClearColor(0.5f,0.5f,0.5f,1.0f);
  glClear(GL_COLOR_BUFFER_BIT);
  [m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

- (void) dealloc
{
  if([EAGLContext currentContext] == m_context)
    [EAGLContext setCurrentContext:nil];
  [m_context release];
  [super dealloc];
}

Большое спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2012

Вы забыли включить строку после

[m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];
////
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, renderbuffer);
////

, а также условие

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)

всегда верно !!!Даже если я получаю желаемый результат.

0 голосов
/ 24 февраля 2012

Я не могу найти документацию, которая объясняет это в любом случае, но я думаю, что вам может просто понадобиться явно создать буфер кадра.В GL буфер рендеринга - это все, что может быть записано некоторым компонентом исходящих фрагментов - таким образом, буфер цвета, такой как созданный вами, или буфер глубины, или буфер трафарета, или что-нибудь еще в этом роде.Фрейм-буфер - это набор буферов рендеринга, которые составляют цель рисования.

Так что это все довольно тривиальные вещи, но вы бы добавили вызов glGenFramebuffersOES, а затем glBindFramebufferOES до glBindRenderbufferOES (поскольку это связывает буфер рендеринга в контексте буфера кадра).И в случае, если вы когда-нибудь добавите рендер к текстуре или решите использовать мультисэмплирующее расширение Apple, это буфер кадров, который вы будете связывать и развязывать, а не буфер рендеринга.вызов glCheckFramebufferStatusOES после того, как вы связали и создали нужные буферы рендеринга - просто что-то быстрое, например:

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
    // some sort of error path here
}

Это поможет устранить одну область исследования, если вы все еще получаете бессмысленный пиксельвыход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...