diff options
Diffstat (limited to 'src/libjin/Graphics/Shader.cpp')
-rw-r--r-- | src/libjin/Graphics/Shader.cpp | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/src/libjin/Graphics/Shader.cpp b/src/libjin/Graphics/Shader.cpp index 6c8e3b5..a45fcf0 100644 --- a/src/libjin/Graphics/Shader.cpp +++ b/src/libjin/Graphics/Shader.cpp @@ -24,11 +24,11 @@ namespace graphics #include "Shaders/base.shader.h" #include "Shaders/default.shader.h" - const char* Shader::PROJECTION_MATRIX = "_projectionMatrix_"; - const char* Shader::MODEL_MATRIX = "_modelMatrix_"; - const char* Shader::MAIN_TEXTURE = "_main_texture_"; - const char* Shader::VERTEX_COORDS = "_vert_coord_"; - const char* Shader::TEXTURE_COORDS = "_tex_coord_"; + const char* Shader::SHADER_PROJECTION_MATRIX = "jin_ProjectionMatrix"; + const char* Shader::SHADER_MODEL_MATRIX = "jin_ModelMatrix"; + const char* Shader::SHADER_MAIN_TEXTURE = "jin_MainTexture"; + const char* Shader::SHADER_VERTEX_COORDS = "jin_VertexCoords"; + const char* Shader::SHADER_TEXTURE_COORDS = "jin_TextureCoords"; /** * https://stackoverflow.com/questions/27941496/use-sampler-without-passing-through-value @@ -86,6 +86,7 @@ namespace graphics bool Shader::compile(const string& program) { + /* parse shader source, need some optimizations */ int loc_VERTEX_SHADER = program.find("#VERTEX_SHADER"); int loc_END_VERTEX_SHADER = program.find("#END_VERTEX_SHADER"); int loc_FRAGMENT_SHADER = program.find("#FRAGMENT_SHADER"); @@ -96,12 +97,13 @@ namespace graphics || loc_END_FRAGMENT_SHADER == string::npos ) return false; - int p = loc_VERTEX_SHADER + strlen("#VERTEX_SHADER"); - string vertex_shader = program.substr(p, loc_END_VERTEX_SHADER - p); + /* load vertex and fragment shader source into buffers */ + int start = loc_VERTEX_SHADER + strlen("#VERTEX_SHADER"); + string vertex_shader = program.substr(start, loc_END_VERTEX_SHADER - start); Buffer vbuffer = Buffer(vertex_shader.length() + BASE_VERTEX_SHADER_SIZE); formatVertexShader((char*)vbuffer.data, vertex_shader.c_str()); - p = loc_FRAGMENT_SHADER + strlen("#FRAGMENT_SHADER"); - string fragment_shader = program.substr(p, loc_END_FRAGMENT_SHADER - p); + start = loc_FRAGMENT_SHADER + strlen("#FRAGMENT_SHADER"); + string fragment_shader = program.substr(start, loc_END_FRAGMENT_SHADER - start); Buffer fbuffer = Buffer(fragment_shader.length() + BASE_FRAGMENT_SHADER_SIZE); formatFragmentShader((char*)fbuffer.data, fragment_shader.c_str()); /* compile */ @@ -110,18 +112,12 @@ namespace graphics glShaderSource(vshader, 1, (const GLchar**)&vbuffer.data, NULL); glCompileShader(vshader); glGetShaderiv(vshader, GL_COMPILE_STATUS, &success); - //std::cout << (char*)vbuffer.data << std::endl; - //Buffer log = Buffer(1024); - //int len; - //glGetShaderInfoLog(vshader, sizeof(log), &len, (GLchar*)log.data); - //std::cout << (char*)log.data << std::endl; if (success == GL_FALSE) return false; GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fshader, 1, (const GLchar**)&fbuffer.data, NULL); glCompileShader(fshader); glGetShaderiv(fshader, GL_COMPILE_STATUS, &success); - //std::cout << (char*)fbuffer.data << std::endl; if (success == GL_FALSE) return false; pid = glCreateProgram(); @@ -129,8 +125,6 @@ namespace graphics glAttachShader(pid, fshader); glLinkProgram(pid); glGetProgramiv(pid, GL_LINK_STATUS, &success); - //glGetProgramInfoLog(pid, 1024, &len, (GLchar*)log.data); - //std::cout << (char*)log.data << std::endl; if (success == GL_FALSE) throw false; } @@ -141,12 +135,12 @@ namespace graphics glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); return maxTextureUnits; } - + void Shader::use() { glUseProgram(pid); currentShader = this; - sendInt(Shader::MAIN_TEXTURE, DEFAULT_TEXTURE_UNIT); + sendInt(Shader::SHADER_MAIN_TEXTURE, DEFAULT_TEXTURE_UNIT); } /*static*/ void Shader::unuse() @@ -277,14 +271,14 @@ namespace graphics void Shader::bindVertexPointer(int n, GLenum type, GLsizei stride, const GLvoid * pointers) { - GLint loc = glGetAttribLocation(pid, VERTEX_COORDS); + GLint loc = glGetAttribLocation(pid, SHADER_VERTEX_COORDS); glEnableVertexAttribArray(0); glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers); } void Shader::bindUVPointer(int n, GLenum type, GLsizei stride, const GLvoid * pointers) { - GLint loc = glGetAttribLocation(pid, TEXTURE_COORDS); + GLint loc = glGetAttribLocation(pid, SHADER_TEXTURE_COORDS); glEnableVertexAttribArray(1); glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers); } |