`
jsntghf
  • 浏览: 2512579 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

OpenGL的简单示例

    博客分类:
  • iOS
阅读更多

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的核心是它的绘图函数集,这些函数允许程序员指定图形的几何形状、颜色、纹理等属性,并将它们绘制到屏幕上。...

    OpenGL简单DEMO示例

    OpenGL简单DEMO示例,界面不是很友好哈,对OpenGL的简单使用,和初学OpenGL的童鞋交流交流,内附完整代码及示例程序

    OBJ2OpenGLES 示例代码

    加载简单的模型,使用简单的opengl技术实现,加载简单的模型,使用简单的opengl技术实现,加载简单的模型,使用简单的opengl技术实现,加载简单的模型,使用简单的opengl技术实现,

    OPENGL简单小代码

    这个名为"OPENGL简单小代码"的压缩包很可能是包含了一些基础的OpenGL编程示例,可能是为了帮助开发者理解和学习如何在MFC环境中使用OpenGL。 OpenGL是一个跨语言、跨平台的应用程序编程接口(API),它允许程序员...

    第一个使用VS2012 IDE环境编写的OpenGL应用示例

    这是一个关于OpenGL图形编程的示例程序,可以帮助那些想了解OpenGL图形编程原理的入门示例程序。 前置条件:先阅读压缩包里有一个"Windows 7下OpenGL如何配置"的帮助文档,其中第4个步骤在我的机器上没有,于是使用...

    qt实现opengl简单例子

    下面是一个简单的`QOpenGLWidget`子类的示例: ```cpp class OpenGLWidget : public QOpenGLWidget { Q_OBJECT public: explicit OpenGLWidget(QWidget *parent = nullptr); ~OpenGLWidget(); protected: void...

    android opengl es一些简单的示例

    opengles 的一些简单示例,非常适合初学者,并且有一大片的注释。。。自学者用起来还不错,只是比较浅

    Android OpenGL 示例程序

    Android OpenGL 3D开发,示例程序,简单实用

    OpenGL简单太阳系

    OpenGL简单太阳系是一个基于OpenGL图形库的编程示例,它旨在模拟一个简化的太阳系模型。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。这个程序通过创建两个基本的线条图形来表示行星,演示它们在...

    OpenGL = Hello World

    "OpenGL = Hello World" 这个标题暗示我们将探讨如何使用OpenGL进行基础的图形渲染,这通常是从一个简单的“Hello World”程序开始的。 在计算机编程中,“Hello World”程序是一个传统的起点,用于展示语言的基本...

    OpenGL简单框架代码

    OpenGL简单框架代码是针对计算机图形学初学者设计的一个基础学习平台,它允许用户轻松地开始使用OpenGL进行图形绘制。OpenGL是一种跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形,广泛应用于游戏开发、科学可视...

    OpenGL.rar_opengl_opengl简单

    这个“OpenGL.rar_opengl_opengl简单”压缩包显然是针对初学者设计的,旨在帮助他们快速入门OpenGL编程。下面将详细阐述OpenGL的基础知识以及在Windows环境下与Visual C++(VC)的结合使用。 1. **OpenGL基本概念**...

    OpenGL立体显示示例.rar

    Glut是一个用于OpenGL编程的简单易用的跨平台工具包,提供了窗口管理、事件处理等功能,是学习OpenGL的经典辅助库。 通过分析这些源代码,你可以了解到如何在实际项目中结合OpenGL和Glut实现立体显示。这不仅有助于...

    Opengl简单图片处理

    在"OpenGL简单图片处理"这个主题中,我们将探讨如何使用OpenGL来加载图像并对其进行印象派风格的处理。 首先,要加载图片,我们需要一个图像处理库,如FreeImage或SOIL,它们提供了方便的API来读取常见的图像格式...

    opengl_code_examples:OpenGL代码示例

    OpenGL代码示例 此存储库中的代码取自并经过修改以在带有MSYS2 / MINGW的Windows 10上构建和运行。 工作正在进行中 2021年3月26日 从下载并提取了以下示例: accum.c用于测试累积的简单程序。 bitmap1.c用于测试...

    opengl入门&示例代码.zip

    初学者可以从简单的"Hello, Triangle"程序开始,逐步了解并掌握OpenGL的各个部分。这个压缩包提供的示例代码将是一个很好的实践平台,通过运行和修改代码,你可以加深对OpenGL工作原理的理解。在实践中,你还会接触...

    OpenGL.rar_opengl colorcube_opengl简单

    这个"OpenGL.rar_opengl colorcube_opengl简单"压缩包文件内容是关于使用OpenGL实现一个简单的渐变色立方体,并使其进行逆时针旋转的示例。下面将详细介绍OpenGL的基本概念、颜色立方体的绘制以及逆时针旋转的实现。...

    opengl第一个示例

    这个简单的例子展示了OpenGL的基本工作流程,为更复杂的图形渲染打下了基础。 然而,现代OpenGL不再直接支持这种固定功能管线(fixed-function pipeline)的方式。现在,我们倾向于使用顶点着色器和片段着色器等可...

    OpenGL.rar_opengl简单

    这个“OpenGL.rar_opengl简单”压缩包中的内容,很可能是为了介绍如何在有限的代码量下,快速理解和实践OpenGL的基本用法。 OpenGL是一个强大的图形库,它允许程序员通过编写程序来控制计算机的图形处理硬件,以...

Global site tag (gtag.js) - Google Analytics