4
// Created by döme on 08.08.2009.
8
* Copyright (c) 2009 Doemoetoer Gulyas.
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. The name of the author may not be used to endorse or promote products
20
* derived from this software without specific prior written permission.
22
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
#import <OpenGLES/ES2/gl.h>
38
@implementation ES2Shader
40
- (id) initWithVertexShaderString: (NSString*) vs fragmentShaderString: (NSString*) fs
42
if (!(self = [super init]))
45
const char* vsString = [vs UTF8String];
46
const char* fsString = [fs UTF8String];
48
vsShader = glCreateShader(GL_VERTEX_SHADER);
49
fsShader = glCreateShader(GL_FRAGMENT_SHADER);
54
glShaderSource(vsShader, 1, &vsString, NULL);
55
glShaderSource(fsShader, 1, &fsString, NULL);
57
glCompileShader(vsShader);
62
glGetShaderiv(vsShader, GL_COMPILE_STATUS, &vsStatus);
67
glGetShaderiv(vsShader, GL_INFO_LOG_LENGTH, &logLength);
69
char* infoLog = calloc(1, logLength);
70
glGetShaderInfoLog(vsShader, logLength, NULL, infoLog);
72
NSLog(@"Vertex shader compilation failed: %s", infoLog);
75
glCompileShader(fsShader);
80
glGetShaderiv(fsShader, GL_COMPILE_STATUS, &fsStatus);
85
glGetShaderiv(fsShader, GL_INFO_LOG_LENGTH, &logLength);
87
char* infoLog = calloc(1, logLength);
88
glGetShaderInfoLog(fsShader, logLength, NULL, infoLog);
90
NSLog(@"Fragment shader compilation failed: %s", infoLog);
93
programObj = glCreateProgram();
97
glAttachShader(programObj, fsShader);
98
glAttachShader(programObj, vsShader);
100
glBindAttribLocation(programObj, POSITION_ATTRIB_INDEX, "position");
101
glBindAttribLocation(programObj, NORMAL_ATTRIB_INDEX, "normal");
102
glBindAttribLocation(programObj, TEXCOORD_ATTRIB_INDEX, "texcoord");
104
glLinkProgram(programObj);
106
GLint linkStatus = 0;
107
glGetProgramiv(programObj, GL_LINK_STATUS, &linkStatus);
112
glGetProgramiv(programObj, GL_INFO_LOG_LENGTH, &logLength);
114
char* infoLog = calloc(1, logLength);
115
glGetProgramInfoLog(programObj, logLength, NULL, infoLog);
117
NSLog(@"Shader linking failed: %s", infoLog);
120
sampler0loc = glGetUniformLocation(programObj, "tex0");
121
glUniform1i(sampler0loc, 0);
126
- (id) initWithVertexShaderFile: (NSString*) vs fragmentShaderFile: (NSString*) fs
128
if (!(self = [super init]))
131
NSData* vsData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: vs ofType: nil]];
132
NSData* fsData = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: fs ofType: nil]];
134
vsShader = glCreateShader(GL_VERTEX_SHADER);
135
fsShader = glCreateShader(GL_FRAGMENT_SHADER);
140
GLint lvs = [vsData length];
141
GLint lfs = [fsData length];
143
const char* vsString = [vsData bytes];
144
const char* fsString = [fsData bytes];
146
glShaderSource(vsShader, 1, &vsString, &lvs);
147
glShaderSource(fsShader, 1, &fsString, &lfs);
149
glCompileShader(vsShader);
154
glGetShaderiv(vsShader, GL_COMPILE_STATUS, &vsStatus);
159
glGetShaderiv(vsShader, GL_INFO_LOG_LENGTH, &logLength);
161
char* infoLog = calloc(1, logLength);
162
glGetShaderInfoLog(vsShader, logLength, NULL, infoLog);
164
NSLog(@"Vertex shader compilation failed: %s", infoLog);
167
glCompileShader(fsShader);
172
glGetShaderiv(fsShader, GL_COMPILE_STATUS, &fsStatus);
177
glGetShaderiv(fsShader, GL_INFO_LOG_LENGTH, &logLength);
179
char* infoLog = calloc(1, logLength);
180
glGetShaderInfoLog(fsShader, logLength, NULL, infoLog);
182
NSLog(@"Fragment shader compilation failed: %s", infoLog);
185
programObj = glCreateProgram();
189
glAttachShader(programObj, fsShader);
190
glAttachShader(programObj, vsShader);
192
glBindAttribLocation(programObj, POSITION_ATTRIB_INDEX, "position");
193
glBindAttribLocation(programObj, NORMAL_ATTRIB_INDEX, "normal");
194
glBindAttribLocation(programObj, TEXCOORD_ATTRIB_INDEX, "texcoord");
196
glLinkProgram(programObj);
198
GLint linkStatus = 0;
199
glGetProgramiv(programObj, GL_LINK_STATUS, &linkStatus);
204
glGetProgramiv(programObj, GL_INFO_LOG_LENGTH, &logLength);
206
char* infoLog = calloc(1, logLength);
207
glGetProgramInfoLog(programObj, logLength, NULL, infoLog);
209
NSLog(@"Shader linking failed: %s", infoLog);
212
sampler0loc = glGetUniformLocation(programObj, "tex0");
213
glUniform1i(sampler0loc, 0);
220
glDeleteProgram(programObj);
221
glDeleteShader(fsShader);
222
glDeleteShader(vsShader);
229
glUseProgram(programObj);
232
- (void) setModelviewMatrix: (m16*) m
234
m16 nm = mtranspose(minverse(*m));
235
if (!modelviewMatrixLoc)
236
modelviewMatrixLoc = glGetUniformLocation(programObj, "modelviewMatrix");
237
if (!normalMatrixLoc)
238
normalMatrixLoc = glGetUniformLocation(programObj, "normalMatrix");
240
glUniformMatrix4fv(modelviewMatrixLoc, 1, GL_FALSE, m->a);
241
glUniformMatrix4fv(normalMatrixLoc, 1, GL_FALSE, nm.a);
244
- (void) setProjectionMatrix: (m16*) m
246
if (!projectionMatrixLoc)
247
projectionMatrixLoc = glGetUniformLocation(programObj, "projectionMatrix");
248
glUniformMatrix4fv(projectionMatrixLoc, 1, GL_FALSE, m->a);
250
- (void) setTextureMatrix: (m16*) m
252
if (!textureMatrixLoc)
253
textureMatrixLoc = glGetUniformLocation(programObj, "textureMatrix");
254
glUniformMatrix4fv(textureMatrixLoc, 1, GL_FALSE, m->a);
257
- (void) setColorRed: (float) r green: (float) g blue: (float) b alpha: (float) a
260
colorLoc = glGetUniformLocation(programObj, "color");
261
glUniform4f(colorLoc, r, g, b, a);