Haxel Engine learning 24 -- Shader Abstraction and Uniforms

Cherno视频:https://www.youtube.com/watch?v=d5wL6eZnWMU&list=PLlrATfBNZ98dC-V-N3m0Go4deliWHPFwT&index=40

完整代码:https://github.com/DXT00/Hazel_study/tree/b1eb8187441f9699e7d887490a53c0044f399638/Hazel

把Shader设为抽象类

OpenGLShader继承Shader

Shader.h

#pragma once
#include <string>
#include<glm/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"
#include<glad/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>
#include<glm/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给fragmentShader

		const 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.5+0.5, 1.0);

				}
				)";

std::dynamic_pointer_cast<Hazel::OpenGLShader>(m_SquareShader)->Bind();
std::dynamic_pointer_cast<Hazel::OpenGLShader>(m_SquareShader)->SetUniformFloat3("u_Color",m_SquareColor);

通过ImGui改变 m_SquareColor

	virtual void OnImGuiRender() override
	{
		ImGui::Begin("Settings");
		ImGui::ColorEdit3("Suqare Color", glm::value_ptr(m_SquareColor));
		ImGui::End();
	}

F5运行:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值