Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL ES iPhone,使用glClearColor时损坏图像_Iphone_Opengl Es - Fatal编程技术网

OpenGL ES iPhone,使用glClearColor时损坏图像

OpenGL ES iPhone,使用glClearColor时损坏图像,iphone,opengl-es,Iphone,Opengl Es,我刚刚开始了解iPhone上的OpenGL ES。我试图得到一个非常简单的示例,它设置了一个EagleContext和渲染缓冲区,然后简单地使用glClearColor设置屏幕颜色 我的代码编译并执行,但不幸的是,我看到的不是预期的灰色屏幕,而是带有随机损坏模式的白色图像。我猜我没有把事情安排好,我希望我的错误对在这方面有点经验的人来说是显而易见的 我的代码是: AppDelegate.h #import "GLView.h" #import <UIKit/UIKit.h> @in

我刚刚开始了解iPhone上的OpenGL ES。我试图得到一个非常简单的示例,它设置了一个EagleContext和渲染缓冲区,然后简单地使用glClearColor设置屏幕颜色

我的代码编译并执行,但不幸的是,我看到的不是预期的灰色屏幕,而是带有随机损坏模式的白色图像。我猜我没有把事情安排好,我希望我的错误对在这方面有点经验的人来说是显而易见的

我的代码是:

AppDelegate.h

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

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

@end
GLView.h

#import <QuartzCore/QuartzCore.h>

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

}

- (void) drawView;

@end
#导入
@界面视图:UIView{
@私人的
EAGLContext*m_上下文;
}
-(无效)drawView;
@结束
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];
}
#包括
#包括
#导入“GLView.h”
@实现视图
+(类)层类
{
返回[caeaglayer类];
}
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
//设置图层和上下文
caeaglayer*eaglayer=(caeaglayer*)super.layer;
eaglLayer.不透明=是;
m_context=[[EAGLContext alloc]initWithAPI:keagrenderingapiopengles1];
if(!m|u context |![EagleContext setCurrentContext:m|u context]){
[自我释放];
返回零;
}
//创建并绑定颜色缓冲区,以便调用者可以分配其空间。
GLuint renderbuffer;
glGenRenderbuffersOES(1和renderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES,RENDERBUFFER);
[m_context renderbufferStorage:GL_RENDERBUFFER_OES from drawable:eaglLayer];
glViewport(0,0,CGRectGetWidth(帧),CGRectGetHeight(帧));
[自绘制视图];
}
回归自我;
}
-(无效)drawView
{
glClearColor(0.5f、0.5f、0.5f、1.0f);
glClear(GLU颜色缓冲位);
[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
-(无效)解除锁定
{
if([EAGLContext currentContext]==m_context)
[EAGLContext setCurrentContext:nil];
[m_上下文发布];
[super dealoc];
}

非常感谢您的帮助。

我找不到任何一种方式明确说明的文档,但我认为您可能只需要明确创建一个帧缓冲区。在GL中,渲染缓冲区是输出片段的某个组件可以写入的任何内容,因此可以创建颜色缓冲区,如创建的颜色缓冲区、深度缓冲区、模具缓冲区或其他类似的内容。帧缓冲区是构成图形目标的渲染缓冲区的集合

因此,这些都是相当琐碎的东西,但您要添加的是对
glGenFramebuffersOES
的调用,然后在
glBindRenderbufferOES
之前调用
glbindredrbufferoes
(这会在帧缓冲区的上下文中绑定渲染缓冲区)。如果您将渲染添加到纹理或决定使用Apple的多采样扩展,那么您将绑定和解除绑定的是帧缓冲区,而不是渲染缓冲区

为了验证正确性,在绑定并创建所需的渲染缓冲区后,还应调用
glCheckFramebufferStatusOES
,例如:

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

如果你仍然得到无意义的像素输出,这将有助于消除一个调查区域。

你忘记在后面加一行

[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)
永远是真的!!!即使我被要求离开

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)