Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // ViewController.m
- // OrthoTest
- //
- //
- #import "ViewController.h"
- #define BUFFER_OFFSET(i) ((char *)NULL + (i))
- // Uniform index.
- enum
- {
- UNIFORM_MODELVIEWPROJECTION_MATRIX,
- UNIFORM_NORMAL_MATRIX,
- NUM_UNIFORMS
- };
- GLint uniforms[NUM_UNIFORMS];
- // Attribute index.
- enum
- {
- ATTRIB_VERTEX,
- NUM_ATTRIBUTES
- };
- GLint attributes[NUM_ATTRIBUTES];
- GLKVector2 vertices[4];
- GLushort indices[6];
- @interface ViewController () {
- GLuint _program;
- GLKMatrix4 _modelViewProjectionMatrix;
- GLuint _vertexBuffer;
- GLuint _indexBuffer;
- }
- @property (strong, nonatomic) EAGLContext *context;
- @property (strong, nonatomic) GLKBaseEffect *effect;
- - (void)setupGL;
- - (void)tearDownGL;
- - (BOOL)loadShaders;
- - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
- - (BOOL)linkProgram:(GLuint)prog;
- - (BOOL)validateProgram:(GLuint)prog;
- @end
- @implementation ViewController
- @synthesize context = _context;
- @synthesize effect = _effect;
- - (void)dealloc
- {
- [_context release];
- [_effect release];
- [super dealloc];
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease];
- if (!self.context) {
- NSLog(@"Failed to create ES context");
- }
- GLKView *view = (GLKView *)self.view;
- view.context = self.context;
- [self setupGL];
- }
- - (void)viewDidUnload
- {
- [super viewDidUnload];
- [self tearDownGL];
- if ([EAGLContext currentContext] == self.context) {
- [EAGLContext setCurrentContext:nil];
- }
- self.context = nil;
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- // Release any cached data, images, etc. that aren't in use.
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
- return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
- } else {
- return YES;
- }
- }
- - (void)setupGL
- {
- [EAGLContext setCurrentContext:self.context];
- [self loadShaders];
- float width = 2;
- float height = 2;
- vertices[0] = GLKVector2Make(-width/2.0, -height/2.0);
- vertices[1] = GLKVector2Make( width/2.0, -height/2.0);
- vertices[2] = GLKVector2Make( width/2.0, height/2.0);
- vertices[3] = GLKVector2Make(-width/2.0, height/2.0);
- indices[0] = 0;
- indices[1] = 1;
- indices[2] = 2;
- indices[3] = 0;
- indices[4] = 2;
- indices[5] = 3;
- glGenBuffers(1, &_vertexBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glGenBuffers(1, &_indexBuffer);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
- GLenum err = glGetError();
- if (err != GL_NO_ERROR)
- {
- NSLog(@"0 err = %u", err);
- }
- }
- - (void)tearDownGL
- {
- [EAGLContext setCurrentContext:self.context];
- glDeleteBuffers(1, &_vertexBuffer);
- self.effect = nil;
- if (_program) {
- glDeleteProgram(_program);
- _program = 0;
- }
- }
- #pragma mark - GLKView and GLKViewController delegate methods
- - (void)update
- {
- GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, 6, 0, 4, -1, 1);
- // Compute the model view matrix for the object rendered with GLKit
- GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;
- _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);
- }
- - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
- {
- glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- // Render the object again with ES2
- glUseProgram(_program);
- glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
- glVertexAttribPointer(attributes[ATTRIB_VERTEX], 2, GL_FLOAT, GL_FALSE, 0, NULL);
- glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, NULL);
- GLenum err = glGetError();
- if (err != GL_NO_ERROR)
- {
- NSLog(@"1 err = %u", err);
- }
- }
- #pragma mark - OpenGL ES 2 shader compilation
- - (BOOL)loadShaders
- {
- GLuint vertShader, fragShader;
- NSString *vertShaderPathname, *fragShaderPathname;
- // Create shader program.
- _program = glCreateProgram();
- // Create and compile vertex shader.
- vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"];
- if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {
- NSLog(@"Failed to compile vertex shader");
- return NO;
- }
- // Create and compile fragment shader.
- fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];
- if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) {
- NSLog(@"Failed to compile fragment shader");
- return NO;
- }
- // Attach vertex shader to program.
- glAttachShader(_program, vertShader);
- // Attach fragment shader to program.
- glAttachShader(_program, fragShader);
- // Link program.
- if (![self linkProgram:_program]) {
- NSLog(@"Failed to link program: %d", _program);
- if (vertShader) {
- glDeleteShader(vertShader);
- vertShader = 0;
- }
- if (fragShader) {
- glDeleteShader(fragShader);
- fragShader = 0;
- }
- if (_program) {
- glDeleteProgram(_program);
- _program = 0;
- }
- return NO;
- }
- // Get uniform locations.
- uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix");
- attributes[ATTRIB_VERTEX] = glGetAttribLocation(_program, "position");
- // Release vertex and fragment shaders.
- if (vertShader) {
- glDetachShader(_program, vertShader);
- glDeleteShader(vertShader);
- }
- if (fragShader) {
- glDetachShader(_program, fragShader);
- glDeleteShader(fragShader);
- }
- return YES;
- }
- - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file
- {
- GLint status;
- const GLchar *source;
- source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];
- if (!source) {
- NSLog(@"Failed to load vertex shader");
- return NO;
- }
- *shader = glCreateShader(type);
- glShaderSource(*shader, 1, &source, NULL);
- glCompileShader(*shader);
- #if defined(DEBUG)
- GLint logLength;
- glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
- if (logLength > 0) {
- GLchar *log = (GLchar *)malloc(logLength);
- glGetShaderInfoLog(*shader, logLength, &logLength, log);
- NSLog(@"Shader compile log:\n%s", log);
- free(log);
- }
- #endif
- glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
- if (status == 0) {
- glDeleteShader(*shader);
- return NO;
- }
- return YES;
- }
- - (BOOL)linkProgram:(GLuint)prog
- {
- GLint status;
- glLinkProgram(prog);
- #if defined(DEBUG)
- GLint logLength;
- glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
- if (logLength > 0) {
- GLchar *log = (GLchar *)malloc(logLength);
- glGetProgramInfoLog(prog, logLength, &logLength, log);
- NSLog(@"Program link log:\n%s", log);
- free(log);
- }
- #endif
- glGetProgramiv(prog, GL_LINK_STATUS, &status);
- if (status == 0) {
- return NO;
- }
- return YES;
- }
- - (BOOL)validateProgram:(GLuint)prog
- {
- GLint logLength, status;
- glValidateProgram(prog);
- glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
- if (logLength > 0) {
- GLchar *log = (GLchar *)malloc(logLength);
- glGetProgramInfoLog(prog, logLength, &logLength, log);
- NSLog(@"Program validate log:\n%s", log);
- free(log);
- }
- glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
- if (status == 0) {
- return NO;
- }
- return YES;
- }
- @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement