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运行: