Initial commit
This commit is contained in:
commit
3c881febc8
5 changed files with 831 additions and 0 deletions
26
OpenGL/Shader.h
Normal file
26
OpenGL/Shader.h
Normal 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
92
OpenGL/Shader.m
Normal 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
27
OpenGL/ShaderProgram.h
Normal 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
106
OpenGL/ShaderProgram.m
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue