Shader Abstraction and Uniforms

我们之前创建的 Shder 类主要是依赖于 OpenGL 的,并没有完全抽象出来,这节的主要内容就是将 Shader 抽象,具体的实现放到 OpenGLShader 中。

首先先进行原来 Shader 中内容的修改:

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);};

这里还是类似于之前创建 VertexBuffer 的时候进行的操作,将 Bind 和 UnBind 函数设为纯虚函数,然后设置 Create 函数来拿到 OpenGLShader 的实例。

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!"); return nullptr;case RendererAPI::API::OpenGL:  return new OpenGLShader(vertexSrc, fragmentSrc);}HZ_CORE_ASSERT(false, "Unknown RendererAPI!");return nullptr;
}

然后在 Platform/OpenGL 中创建OpenGLShader.h OpenGLShader.cpp 两个文件

class OpenGLShader : public Shader{public:OpenGLShader(const std::string& VertexSrc, const std::string& FragmentSrc);virtual ~OpenGLShader();virtual void Bind() const override;virtual void UnBind() const override;void UpLoadUniformInt(const std::string& name,int value);void UpLoadUniformFloat(const std::string& name,float value);void UpLoadUniformFloat2(const std::string& name, const glm::vec2& values);void UpLoadUniformFloat3(const std::string& name, const glm::vec3& values);void UpLoadUniformFloat4(const std::string& name, const glm::vec4& values);void UpLoadUniformMat3(const std::string& name, const glm::mat3& matrix);void UpLoadUniformMat4(const std::string& name, const glm::mat4& matrix);private:uint32_t m_RendererID;};

这里除了原先 Shader 中实现的 Shder 编译,bind 和 unbind 之外,新添加了一系列的全局变量的设置的函数。

 void OpenGLShader::UpLoadUniformInt(const std::string& name, int value){GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniform1i(location, value);}void OpenGLShader::UpLoadUniformFloat(const std::string& name, float value){GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniform1f(location, value);}void OpenGLShader::UpLoadUniformFloat2(const std::string& name, const glm::vec2& values){GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniform2f(location, values.x, values.y);}void OpenGLShader::UpLoadUniformFloat3(const std::string& name, const glm::vec3& values){GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniform3f(location, values.x, values.y, values.z);}void OpenGLShader::UpLoadUniformFloat4(const std::string& name, const glm::vec4& values){GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniform4f(location, values.x, values.y, values.z, values.w);}void OpenGLShader::UpLoadUniformMat3(const std::string& name, const glm::mat3& matrix){GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniformMatrix3fv(location, 1, GL_FALSE, glm::value_ptr(matrix));}void OpenGLShader::UpLoadUniformMat4(const std::string& name, const glm::mat4& matrix){//返回一个 int 值,这个值会验证我们传入的值是否有效GLint location = glGetUniformLocation(m_RendererID, name.c_str());glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(matrix));}

Renderer.cpp Submit 函数中,由于我们创建的时候是创建的 Shader,这时候我们还没有根据不同平台抽象 uniform 的设置,所以这里需要把 Shader 的指针转换成为 OpenGLShader,使用的是 dynamic_pointer_cast ,该类型转换主要是向下转换安全,然后专门用于智能指针的类型转换,用 dynamic_cast 编译不通过。

void Renderer::Submit(const std::shared_ptr<Shader>& shader, const std::shared_ptr<VertexArray>& vertexArray, const glm::mat4 transform ){shader->Bind();std::dynamic_pointer_cast<OpenGLShader>(shader)->UpLoadUniformMat4("u_ViewProjection", s_SceneData->ViewProjectionMatrix);std::dynamic_pointer_cast<OpenGLShader>(shader)->UpLoadUniformMat4("u_Transform", transform);vertexArray->Bind();RenderCommand::DrawIndexed(vertexArray);
}

SandBox 中进行如下修改:

m_Shader.reset(Hazel::Shader::Create(vertexSrc, fragmentSrc)); //用 Create 创建std::dynamic_pointer_cast<Hazel::OpenGLShader>(m_FlatColorShader)->Bind();std::dynamic_pointer_cast<Hazel::OpenGLShader>(m_FlatColorShader)->UpLoadUniformFloat3("u_Color", m_FlatColor);//使用的时候也需要进行类型转换

这里我们用 ImGui 创建了一个调色盘来进行颜色的设置:

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

这样就可以调节颜色了:

HazelEngine 学习记录 - Shader Abstraction and Uniforms相关推荐

  1. HazelEngine 学习记录 - 2D Renderer Transforms and 2D Renderer Textures

    2D Renderer Transforms and 2D Renderer Textures 在2D renderer 中,我们渲染的图元基本上全是矩形,加载纹理时,也是将对应的纹理贴到一个矩形内, ...

  2. HazelEngine 学习记录 - Layers

    Layers 游戏引擎的层级理解如下: 首先很容易接触到的是游戏制作者会调用的表层的各个模块,称为工具层(Tool Layer). 然后我们会理解这些工具背后的逻辑是什么,使用了什么功能,比如游戏世界 ...

  3. HazelEngine 学习记录 - ImGui Docking

    ImGui Docking 本节主要是将 ImGui 从 master 分支移到 Docking 分支,然后修改之前的 ImGuiLayer 文件 首先 cd 到 imgui 目录,然后执行 git ...

  4. Unity Shader 学习记录(3) —— CG语言和Shader文件

    1 什么是语义 赋给shader的输入输出的字符串,表达了参数的含义.语义告诉shader从哪里获取数据,又把数据输出到哪里. 2 Shader的三种debug方法 1 假色彩图像 2 VStudio ...

  5. unity shader 学习记录

    记录下我学习unity shader的过程,并把我看到过的高质量教程推荐给大家! 借助插件shaderforge来熟悉着色的效果,并对照着shaderforge自动生成的shader代码手工优化和实现 ...

  6. 架构与设计 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)的学习记录

    唉   时至今日,已经不知道在嵌入式的道路上到底挣扎了多少个岁月,总感觉要"病入膏肓"了.此间总是不时出现一些疑惑:人家搞 Java.搞 C# 的动不动就是什么架构 / 框架的,搞 ...

  7. Custom SRP 学习记录

    catlikecoding 教程主页:Custom SRP 前段时间学习了shader的多种效果,最近准备学习一下unity URP,听大佬们介绍说学习catlikecoding教程中的SRP即可,所 ...

  8. 曲面细分着色器学习记录

    曲面细分着色器学习记录 前言: 今天终于走通了Catlike大佬的曲面细分着色器教程,感慨一番,自己的学习之路还很漫长呢 今天的博客内容只是简单的记录一下Catlike大佬的教程 先上个链接:Catl ...

  9. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

最新文章

  1. mybatis mysql方言_MyBatis 方言支持 - Mysql to 华为高斯数据库(gaussdb)
  2. 量子计算机,开启中国速度
  3. 他山之石:五个互联网英雄的创业启示!
  4. 水仙花数 java 1 100_Java练习题1:找出100——999数中的所有水仙花数
  5. java to do_java-将连字号分隔的字词(例如“ do-some-stuff”)转换为小写的驼峰形式(例如“ doSomeStuff”)的最优雅方法是什么?...
  6. C#中机密文本的保存方案
  7. 分解预测时间序列c 语言,用R语言做数据分析——时间序列的分解和预测
  8. 秒杀项目(1)项目环境搭建
  9. 沙盘模拟软件_电子沙盘的分类
  10. asp.net-DirectoryEntry基本操作入门
  11. 敏 感 信 息 扫 描 工 具 使 用 对 比
  12. 软件测试工程师离职原因_这就是软件工程师不离职的原因
  13. xsmax进入dfu模式_iPhone XR/XS/XS Max 何如进入恢复模式或 DFU 模式?
  14. linux 如何加定时任务,linux系统添加定时任务
  15. 斗音视频制作技巧和分享技巧
  16. Qgis教程11:三维效果
  17. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...
  18. 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式
  19. 人大金仓数据库的使用心得
  20. 购买iPhone手机时的专业术语名词解析

热门文章

  1. 大数据智能交通未来会是怎样的交通状况?
  2. IMX.6ULL_Linux_基础篇(6) soc资源介绍
  3. 小程序里面关注公众号
  4. h5手机页面注册处理(短信验证)
  5. 自相关法基音提取的matlab程序,自相关函数法基音检测matlab程序
  6. 一起来读书361- 应用密码学:第十一章 数学背景
  7. 辉芒微IO单片机FT60F023-RB
  8. 微软的IE 全称 变为,“Windows Internet Explorer“ ,从IE7 开始了!
  9. Eclipse报错:The import org.apache cannot be resolved
  10. BUUCTF之Ping Ping Ping