EAGLView.h
#import <UIKit/UIKit.h> #import <OpenGLES/EAGL.h> #import <OpenGLES/ES1/gl.h> #import <OpenGLES/ES1/glext.h> @interface EAGLView : UIView { @private /* The pixel dimensions of the backbuffer */ GLint backingWidth; GLint backingHeight; EAGLContext *context; /* OpenGL names for the renderbuffer and framebuffers used to render to this view */ GLuint viewRenderbuffer, viewFramebuffer; /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ GLuint depthRenderbuffer; NSTimer *animationTimer; NSTimeInterval animationInterval; } @property NSTimeInterval animationInterval; - (void)startAnimation; - (void)stopAnimation; - (void)drawView; @end
EAGLView.m
#import <QuartzCore/QuartzCore.h> #import <OpenGLES/EAGLDrawable.h> #import "EAGLView.h" #define USE_DEPTH_BUFFER 0 // A class extension to declare private methods @interface EAGLView () @property (nonatomic, retain) EAGLContext *context; @property (nonatomic, assign) NSTimer *animationTimer; - (BOOL) createFramebuffer; - (void) destroyFramebuffer; @end @implementation EAGLView @synthesize context; @synthesize animationTimer; @synthesize animationInterval; + (Class)layerClass { return [CAEAGLLayer class]; } - (id)initWithCoder:(NSCoder*)coder { if ((self = [super initWithCoder:coder])) { CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; if (!context || ![EAGLContext setCurrentContext:context]) { [self release]; return nil; } self.animationInterval = 1.0 / 60.0; } return self; } - (void)drawView { const GLfloat squareVertices[] = { -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, }; const GLubyte squareColors[] = { 255, 255, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 255, 0, 255, 255, }; [EAGLContext setCurrentContext:context]; glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); glViewport(0, 0, backingWidth, backingHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glRotatef(3.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glVertexPointer(2, 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, viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; } - (void)layoutSubviews { [EAGLContext setCurrentContext:context]; [self destroyFramebuffer]; [self createFramebuffer]; [self drawView]; } - (BOOL)createFramebuffer { glGenFramebuffersOES(1, &viewFramebuffer); glGenRenderbuffersOES(1, &viewRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); if (USE_DEPTH_BUFFER) { 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)destroyFramebuffer { glDeleteFramebuffersOES(1, &viewFramebuffer); viewFramebuffer = 0; glDeleteRenderbuffersOES(1, &viewRenderbuffer); viewRenderbuffer = 0; if(depthRenderbuffer) { glDeleteRenderbuffersOES(1, &depthRenderbuffer); depthRenderbuffer = 0; } } - (void)startAnimation { self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:self.animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES]; } - (void)stopAnimation { self.animationTimer = nil; } - (void)setAnimationTimer:(NSTimer *)newTimer { [animationTimer invalidate]; animationTimer = newTimer; } - (void)setAnimationInterval:(NSTimeInterval)interval { animationInterval = interval; if (animationTimer) { [self stopAnimation]; [self startAnimation]; } } - (void)dealloc { [self stopAnimation]; if ([EAGLContext currentContext] == context) { [EAGLContext setCurrentContext:nil]; } [context release]; [super dealloc]; } @end
相关推荐
这个“opengl简单示例”是面向初学者的一个实例,旨在帮助理解并实践OpenGL的基本概念和操作。 OpenGL的核心是它的绘图函数集,这些函数允许程序员指定图形的几何形状、颜色、纹理等属性,并将它们绘制到屏幕上。...
OpenGL简单DEMO示例,界面不是很友好哈,对OpenGL的简单使用,和初学OpenGL的童鞋交流交流,内附完整代码及示例程序
加载简单的模型,使用简单的opengl技术实现,加载简单的模型,使用简单的opengl技术实现,加载简单的模型,使用简单的opengl技术实现,加载简单的模型,使用简单的opengl技术实现,
下面是一个简单的`QOpenGLWidget`子类的示例: ```cpp class OpenGLWidget : public QOpenGLWidget { Q_OBJECT public: explicit OpenGLWidget(QWidget *parent = nullptr); ~OpenGLWidget(); protected: void...
这个名为"OPENGL简单小代码"的压缩包很可能是包含了一些基础的OpenGL编程示例,可能是为了帮助开发者理解和学习如何在MFC环境中使用OpenGL。 OpenGL是一个跨语言、跨平台的应用程序编程接口(API),它允许程序员...
这是一个关于OpenGL图形编程的示例程序,可以帮助那些想了解OpenGL图形编程原理的入门示例程序。 前置条件:先阅读压缩包里有一个"Windows 7下OpenGL如何配置"的帮助文档,其中第4个步骤在我的机器上没有,于是使用...
opengles 的一些简单示例,非常适合初学者,并且有一大片的注释。。。自学者用起来还不错,只是比较浅
Android OpenGL 3D开发,示例程序,简单实用
OpenGL简单太阳系是一个基于OpenGL图形库的编程示例,它旨在模拟一个简化的太阳系模型。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。这个程序通过创建两个基本的线条图形来表示行星,演示它们在...
"OpenGL = Hello World" 这个标题暗示我们将探讨如何使用OpenGL进行基础的图形渲染,这通常是从一个简单的“Hello World”程序开始的。 在计算机编程中,“Hello World”程序是一个传统的起点,用于展示语言的基本...
OpenGL简单框架代码是针对计算机图形学初学者设计的一个基础学习平台,它允许用户轻松地开始使用OpenGL进行图形绘制。OpenGL是一种跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形,广泛应用于游戏开发、科学可视...
这个“OpenGL.rar_opengl_opengl简单”压缩包显然是针对初学者设计的,旨在帮助他们快速入门OpenGL编程。下面将详细阐述OpenGL的基础知识以及在Windows环境下与Visual C++(VC)的结合使用。 1. **OpenGL基本概念**...
Glut是一个用于OpenGL编程的简单易用的跨平台工具包,提供了窗口管理、事件处理等功能,是学习OpenGL的经典辅助库。 通过分析这些源代码,你可以了解到如何在实际项目中结合OpenGL和Glut实现立体显示。这不仅有助于...
在"OpenGL简单图片处理"这个主题中,我们将探讨如何使用OpenGL来加载图像并对其进行印象派风格的处理。 首先,要加载图片,我们需要一个图像处理库,如FreeImage或SOIL,它们提供了方便的API来读取常见的图像格式...
OpenGL代码示例 此存储库中的代码取自并经过修改以在带有MSYS2 / MINGW的Windows 10上构建和运行。 工作正在进行中 2021年3月26日 从下载并提取了以下示例: accum.c用于测试累积的简单程序。 bitmap1.c用于测试...
初学者可以从简单的"Hello, Triangle"程序开始,逐步了解并掌握OpenGL的各个部分。这个压缩包提供的示例代码将是一个很好的实践平台,通过运行和修改代码,你可以加深对OpenGL工作原理的理解。在实践中,你还会接触...
这个"OpenGL.rar_opengl colorcube_opengl简单"压缩包文件内容是关于使用OpenGL实现一个简单的渐变色立方体,并使其进行逆时针旋转的示例。下面将详细介绍OpenGL的基本概念、颜色立方体的绘制以及逆时针旋转的实现。...
这个简单的例子展示了OpenGL的基本工作流程,为更复杂的图形渲染打下了基础。 然而,现代OpenGL不再直接支持这种固定功能管线(fixed-function pipeline)的方式。现在,我们倾向于使用顶点着色器和片段着色器等可...
这个“OpenGL.rar_opengl简单”压缩包中的内容,很可能是为了介绍如何在有限的代码量下,快速理解和实践OpenGL的基本用法。 OpenGL是一个强大的图形库,它允许程序员通过编写程序来控制计算机的图形处理硬件,以...