diff options
author | chai <chaifix@163.com> | 2019-04-08 22:31:12 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-04-08 22:31:12 +0800 |
commit | 4ea4bbfcb03091cb987dc151d41980ec16f3d18d (patch) | |
tree | bdbe56d8c570b5f243744fbfc5a6cdd2c4f6dc4f /source/modules/asura-core/graphics/shader.cpp | |
parent | e47baca4f23db43ec91fbf64d5d06d7c0dbee495 (diff) |
*misc
Diffstat (limited to 'source/modules/asura-core/graphics/shader.cpp')
-rw-r--r-- | source/modules/asura-core/graphics/shader.cpp | 65 |
1 files changed, 59 insertions, 6 deletions
diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp index e6779df..662ce5e 100644 --- a/source/modules/asura-core/graphics/shader.cpp +++ b/source/modules/asura-core/graphics/shader.cpp @@ -1,5 +1,6 @@ #include <asura-utils/exceptions/exception.h> +#include "gl.h" #include "shader.h" using namespace std; @@ -9,6 +10,17 @@ namespace AsuraEngine namespace Graphics { + /// + /// texture unit + /// + static int _texture_unit = 0; + + const char* Shader::ASLSemantics[] = { + "asura_model_matrix", // BUILTIN_UNIFORM_MODEL_MATRIX + "asura_view_matrix", // BUILTIN_UNIFORM_VIEW_MATRIX + "asura_projection_matrix", // BUILTIN_UNIFORM_PROJECTION_MATRIX + }; + Shader::Shader() { } @@ -85,13 +97,33 @@ namespace AsuraEngine throw Exception("Link shader program failed:\n%s", warnning.c_str()); } + // mvplocation + mMVP[MATRIX_MODE_MODEL] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_MODEL_MATRIX]); + mMVP[MATRIX_MODE_VIEW] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_VIEW_MATRIX]); + mMVP[MATRIX_MODE_PROJECTION] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_PROJECTION_MATRIX]); + return true; } + void Shader::OnUse() + { + _texture_unit = 0; + SetBuiltInUniforms(); + } + + void Shader::OnUnuse() + { + _texture_unit = 0; + } + + int Shader::GetAttributeLocation(const std::string& name) + { + GLint loc = glGetAttribLocation(mProgram, name.c_str()); + return loc; + } + uint Shader::GetUniformLocation(const std::string& uniform) { - // This function returns -1 if name does not correspond to an active uniform variable - // in program or if name starts with the reserved prefix "gl_". GLint loc = glGetUniformLocation(mProgram, uniform.c_str()); return loc; } @@ -102,7 +134,7 @@ namespace AsuraEngine return loc != -1; } - GLuint Shader::GetGLProgramHandle() + GLuint Shader::GetGLProgram() { return mProgram; } @@ -113,10 +145,23 @@ namespace AsuraEngine glUniform1f(loc, value); } - void Shader::SetUniformTexture(uint loc, const Texture& texture) + bool Shader::SetUniformTexture(uint loc, const Texture& texture) { - if (gl.state.shader == this) - glUniform1i(loc, texture.GetGLTextureHandle()); + if (gl.state.shader != this) + return false; + + gl.WipeError(); + glActiveTexture(GL_TEXTURE0 + _texture_unit); + if (gl.HasError()) + return false; + GLint tex = texture.GetGLTexture(); + glBindTexture(GL_TEXTURE_2D, tex); + if (gl.HasError()) + return false; + glUniform1i(loc, _texture_unit); + if (gl.HasError()) + return false; + ++_texture_unit; } void Shader::SetUniformVector2(uint loc, const Math::Vector2f& vec2) @@ -143,6 +188,14 @@ namespace AsuraEngine glUniformMatrix4fv(loc, 1, GL_FALSE, mat.GetElements()); } + void Shader::SetBuiltInUniforms() + { + // model\view\projection matrix + SetUniformMatrix44(mMVP[MATRIX_MODE_MODEL], gl.GetMatrix(MATRIX_MODE_MODEL)); + SetUniformMatrix44(mMVP[MATRIX_MODE_VIEW], gl.GetMatrix(MATRIX_MODE_VIEW)); + SetUniformMatrix44(mMVP[MATRIX_MODE_PROJECTION], gl.GetMatrix(MATRIX_MODE_PROJECTION)); + } + //void Shader::GetUniform() //{ // //if(gl.state.shader == this) |