Haxel Engine learning 24 -- Shader Abstraction and Uniforms

Haxel Engine learning 24 -- Shader Abstraction and Uniforms
Cherno视频https://www.youtube.com/watch?vd5wL6eZnWMUlistPLlrATfBNZ98dC-V-N3m0Go4deliWHPFwTindex40完整代码https://github.com/DXT00/Hazel_study/tree/b1eb8187441f9699e7d887490a53c0044f399638/Hazel把Shader设为抽象类OpenGLShader继承ShaderShader.h#pragma once #include string #includeglm/glm.hpp namespace Hazel { class Shader { public: virtual ~Shader() default; virtual void Bind()const 0; virtual void Unbind() const 0; static Shader* Create(const std::string vertexSrc, const std::string fragmentSrc); private: uint32_t m_RendererID; }; }Shader.cpp#pragma once #include hzpch.h #include Shader.h #include Hazel/Renderer/Renderer.h #include Platform/OpenGL/OpenGLShader.h #includeglad/glad.h namespace Hazel { Shader * Shader::Create(const std::string vertexSrc, const std::string fragmentSrc) { switch (Renderer::GetAPI()) { case RendererAPI::API::None: HZ_CORE_ASSERT(false, RendererAPI::None is currently not supported!) case RendererAPI::API::OpenGL: return new OpenGLShader(vertexSrc,fragmentSrc); } HZ_CORE_ASSERT(false, Unknown RendererAPI) return nullptr; } }OpenGLShader.h#pragma once #include string #includeglm/glm.hpp #include Hazel/Renderer/Shader.h namespace Hazel { class OpenGLShader:public Shader { public: OpenGLShader(const std::string vertexSrc, const std::string fragmentSrc); ~OpenGLShader(); virtual void Bind()const override; virtual void Unbind() const override; void SetUniformInt(const std::string name, int value); void SetUniformFloat(const std::string name, float value); void SetUniformFloat2(const std::string name, const glm::vec2 value); void SetUniformFloat3(const std::string name, const glm::vec3 value); void SetUniformFloat4(const std::string name, const glm::vec4 value); void SetUniformMat3(const std::string name, const glm::mat3 mat); void SetUniformMat4(const std::string name, const glm::mat4 mat); private: uint32_t m_RendererID; }; }通过Uniform传递Color给fragmentShaderconst std::string squareFragmentSrc R( #version 330 core layout(location 0) out vec4 color; in vec3 v_Position; uniform vec3 u_Color; void main() { color vec4(u_Color,1.0f);//vec4(v_Position*0.50.5, 1.0); } );std::dynamic_pointer_castHazel::OpenGLShader(m_SquareShader)-Bind(); std::dynamic_pointer_castHazel::OpenGLShader(m_SquareShader)-SetUniformFloat3(u_Color,m_SquareColor);通过ImGui改变 m_SquareColorvirtual void OnImGuiRender() override { ImGui::Begin(Settings); ImGui::ColorEdit3(Suqare Color, glm::value_ptr(m_SquareColor)); ImGui::End(); }F5运行

最新新闻

日新闻

周新闻

月新闻