@ -10,10 +10,17 @@
# import <OpenGLES / ES2 / gl.h>
# import <OpenGLES / ES2 / glext.h>
// TODO: do glValidateProgram, like in the OpenGL template
// TODO: do glValidateProgram, like in the OpenGL template (see bottom)
// TODO: add error checking at set_uniforms?
// TODO: use an uniform map? (benchmark first!)
namespace J {
enum {
ATTRIB_VERTEX ,
ATTRIB_COLOR ,
NUM_ATTRIBUTES
} ;
class shader {
typedef std : : map < GLenum , GLuint > ShaderMap ;
@ -43,6 +50,12 @@ public:
throw std : : runtime_error ( fragment_shader_filename + " couldn't be opened " ) ;
read_shader ( fragment_shader , GL_FRAGMENT_SHADER ) ;
}
{ // TODO: think of a nice way to implement this
// Bind attribute locations.
// This needs to be done prior to linking.
glBindAttribLocation ( program , ATTRIB_VERTEX , " position " ) ;
glBindAttribLocation ( program , ATTRIB_COLOR , " color " ) ;
}
link_program ( ) ;
}
@ -54,6 +67,7 @@ public:
GLuint shader = it . second ;
glDetachShader ( program , shader ) ;
glDeleteShader ( shader ) ;
// NOTE: If a shader object to be deleted is attached to a program object, it will be flagged for deletion, but it will not be deleted until it is no longer attached to any program object
}
glDeleteProgram ( program ) ;
@ -182,6 +196,31 @@ private:
}
# endif
}
/*
// Validate program before drawing. This is a good check, but only really necessary in a debug build.
- ( 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 FALSE ;
return TRUE ;
}
*/
} ;