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