Initial commit

This commit is contained in:
Sven Weidauer 2013-05-05 16:20:40 +02:00
commit 3c881febc8
5 changed files with 831 additions and 0 deletions

26
OpenGL/Shader.h Normal file
View file

@ -0,0 +1,26 @@
//
// Shader.h
// gles2
//
// Created by Sven Weidauer on 08.07.12.
// Copyright (c) 2012 Sven Weidauer. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Shader : NSObject
@property (readonly, nonatomic) GLenum shaderType;
@property (readonly, nonatomic) GLuint shaderObject;
@property (readonly, nonatomic) NSString *infoLog;
+ (Shader *)vertexShaderNamed: (NSString *)name;
+ (Shader *)fragmentShaderNamed: (NSString *)name;
+ (Shader *)shaderNamed:(NSString *)name type: (GLenum) type;
- initWithType: (GLenum)type;
- (BOOL) compileSource: (NSString *)source;
- (BOOL) compileSourceData: (NSData *)data;
@end

92
OpenGL/Shader.m Normal file
View file

@ -0,0 +1,92 @@
//
// Shader.m
// gles2
//
// Created by Sven Weidauer on 08.07.12.
// Copyright (c) 2012 Sven Weidauer. All rights reserved.
//
#import "Shader.h"
@implementation Shader
- (id)initWithType:(GLenum)type;
{
self = [super init];
if (!self) return nil;
_shaderType = type;
_shaderObject = glCreateShader( type );
if (_shaderObject == 0) return nil;
return self;
}
- (void)dealloc;
{
if (_shaderObject != 0) {
glDeleteShader( _shaderObject );
}
}
- (BOOL)compileSource:(NSString *)source;
{
return [self compileSourceData: [source dataUsingEncoding: NSASCIIStringEncoding]];
}
- (BOOL)compileSourceData:(NSData *)data;
{
const GLchar *string = [data bytes];
GLint length = [data length];
glShaderSource( self.shaderObject, 1, &string, &length );
glCompileShader( self.shaderObject );
GLint compileStatus = 0;
glGetShaderiv( self.shaderObject, GL_COMPILE_STATUS, &compileStatus );
return compileStatus == GL_TRUE;
}
- (NSString *)infoLog;
{
GLint logLength = 0;
glGetShaderiv( self.shaderObject, GL_INFO_LOG_LENGTH, &logLength );
if (logLength == 0) return nil;
char buffer[logLength];
GLsizei actualLength = 0;
glGetShaderInfoLog( self.shaderObject, logLength, &actualLength, buffer );
return [[NSString alloc] initWithBytes: buffer length: actualLength encoding: NSUTF8StringEncoding];
}
+ (Shader *)shaderNamed:(NSString *)name type: (GLenum) type;
{
NSURL *url = [[NSBundle mainBundle] URLForResource: name withExtension: @"glsl"];
NSData *programData = [NSData dataWithContentsOfURL: url];
if (!programData) return nil;
Shader *result = [[self alloc] initWithType: type];
if (![result compileSourceData: programData]) {
NSLog( @"Error compiling shader: %@", result.infoLog );
return nil;
}
return result;
}
+ (Shader *)vertexShaderNamed:(NSString *)name;
{
return [self shaderNamed: name type: GL_VERTEX_SHADER];
}
+ (Shader *)fragmentShaderNamed:(NSString *)name;
{
return [self shaderNamed: name type: GL_FRAGMENT_SHADER];
}
@end

27
OpenGL/ShaderProgram.h Normal file
View file

@ -0,0 +1,27 @@
//
// ShaderProgram.h
// gles2
//
// Created by Sven Weidauer on 08.07.12.
// Copyright (c) 2012 Sven Weidauer. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Shader;
@interface ShaderProgram : NSObject
@property (readonly, nonatomic) GLuint programObject;
@property (readonly, nonatomic) NSArray *shaders;
@property (readonly, nonatomic) NSString *infoLog;
- (void) attachShader: (Shader *)shader;
- (BOOL) link;
+ (ShaderProgram *)programWithShaders: (Shader *)shader, ... NS_REQUIRES_NIL_TERMINATION;
- (GLint)locationForAttribute: (NSString *)attribute;
- (void) use;
@end

106
OpenGL/ShaderProgram.m Normal file
View file

@ -0,0 +1,106 @@
//
// ShaderProgram.m
// gles2
//
// Created by Sven Weidauer on 08.07.12.
// Copyright (c) 2012 Sven Weidauer. All rights reserved.
//
#import "ShaderProgram.h"
#import "Shader.h"
@interface ShaderProgram ()
@property (strong, nonatomic) NSMutableArray *shaderArray;
@end
@implementation ShaderProgram
- (id)init;
{
self = [super init];
if (!self) return nil;
_programObject = glCreateProgram();
if (_programObject == 0) return nil;
_shaderArray = [NSMutableArray array];
return self;
}
- (NSArray *)shaders;
{
return [self.shaderArray copy];
}
- (void)dealloc;
{
if (_programObject != 0) {
glDeleteProgram( _programObject );
}
}
- (void)attachShader:(Shader *)shader;
{
[self.shaderArray addObject: shader];
glAttachShader( self.programObject, shader.shaderObject );
}
- (BOOL)link;
{
glLinkProgram( self.programObject );
GLint linkStatus = 0;
glGetProgramiv( self.programObject, GL_LINK_STATUS, &linkStatus );
return linkStatus == GL_TRUE;
}
- (NSString *)infoLog;
{
GLint logLength = 0;
glGetProgramiv( self.programObject, GL_INFO_LOG_LENGTH, &logLength );
if (logLength == 0) return nil;
char buffer[logLength];
GLsizei length = 0;
glGetProgramInfoLog( self.programObject, logLength, &length, buffer );
return [[NSString alloc] initWithBytes: buffer length: length encoding: NSUTF8StringEncoding];
}
+ (ShaderProgram *)programWithShaders:(Shader *)shader, ...;
{
ShaderProgram *result = [[self alloc] init];
va_list args;
va_start( args, shader );
while (shader) {
[result attachShader: shader];
shader = va_arg( args, Shader * );
}
va_end( args );
if (![ result link]) {
NSLog( @"Error linking shader program: %@", result.infoLog );
return nil;
}
return result;
}
- (GLint)locationForAttribute:(NSString *)attribute;
{
return glGetAttribLocation( self.programObject, [attribute cStringUsingEncoding: NSASCIIStringEncoding] );
}
- (void)use;
{
glUseProgram( self.programObject );
}
@end