diff options
Diffstat (limited to 'Source/Asura.Engine/graphics/shader.h')
-rw-r--r-- | Source/Asura.Engine/graphics/shader.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/Source/Asura.Engine/graphics/shader.h b/Source/Asura.Engine/graphics/shader.h new file mode 100644 index 0000000..103c7b7 --- /dev/null +++ b/Source/Asura.Engine/graphics/shader.h @@ -0,0 +1,123 @@ +#ifndef __ASURA_ENGINE_SHADER_H__ +#define __ASURA_ENGINE_SHADER_H__ + +#include <map> +#include <string> + +#include "FileSystem/Reloadable.h" +#include "Scripting/Luax.hpp" +#include "Math/Vector2.hpp" +#include "Math/Vector3.hpp" +#include "Math/Vector4.h" +#include "Math/Matrix44.h" +#include "StringMap.hpp" +#include "scripting/portable.h" +#include "Color.h" +#include "Manager.hpp" +#include "Texture.h" +#include "GL.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + /// + /// һshaderһڲʼ乲ijShaderuniformsͶݣֻṩuniformsuseɫķ༭ + /// ÿshaderͨshaderҵuniforms¶frameworkmaterialá + /// + class Shader ASURA_FINAL + : public Scripting::Portable<Shader> + , public Filesystem::Reloadable + { + public: + + Shader(); + + ~Shader(); + + /// + /// ӴshaderʱȼǷϴλuniforms location mapʹglAttachShader±ɫ + /// ɫ + /// + bool Load(const std::string& vertexShader, const std::string& fragmentShader); + + /// + /// shaderΪ + /// + void Use(); + + /// + /// shaderΪǻ + /// + void Unuse(); + + /// + /// Ѿ֪uniform location£ֵ + /// + void SetUniformFloat(uint loc, float value); + void SetUniformTexture(uint loc, const Texture& texture); + void SetUniformVector2(uint loc, const Math::Vector2f& vec2); + void SetUniformVector3(uint loc, const Math::Vector3f& vec3); + void SetUniformVector4(uint loc, const Math::Vector4f& vec4); + void SetUniformColor(uint loc, const Color& color); + void SetUniformMatrix44(uint loc, const Math::Matrix44& mat44); + + uint GetUniformLocation(const std::string& uniform); + + bool HasUniform(const std::string& uniform); + + GLuint GetGLProgramHandle(); + + /// + /// texture unitһΪ16 + /// + static uint GetGLTextureUnitCount(); + + private: + + /// + /// ǰshader + /// + static Shader* mCurrentShader; + + /// + /// ñ + /// vec2 Asura_Time xֵΪ뵱ǰʼʱ䣬yֵΪһ֡ʱ + /// vec2 Asura_RenderTargetSize RTĴСΪλ + /// Texture Asura_MainTexture + /// + void SetBuiltInUniforms(); + + /// + /// OpenGL shader program handle. + /// + GLuint mProgramHandle; + + public: + + //---------------------------------------------------------------------------------------------------------- + + LUAX_DECL_FACTORY(SimShader); + + LUAX_DECL_METHOD(l_Use); + LUAX_DECL_METHOD(l_Unuse); + LUAX_DECL_METHOD(l_Load); + LUAX_DECL_METHOD(l_HasUniform); + LUAX_DECL_METHOD(l_GetUniformLocation); + LUAX_DECL_METHOD(l_SetBuiltInUniforms); + LUAX_DECL_METHOD(l_SetUniformFloat); + LUAX_DECL_METHOD(l_SetUniformTexture); + LUAX_DECL_METHOD(l_SetUniformVector2); + LUAX_DECL_METHOD(l_SetUniformVector3); + LUAX_DECL_METHOD(l_SetUniformVector4); + LUAX_DECL_METHOD(l_SetUniformColor); + + //---------------------------------------------------------------------------------------------------------- + + }; + + } +} + +#endif
\ No newline at end of file |