当前位置:   article > 正文

跟着cherno手搓游戏引擎【21】shaderLibrary(shader管理类)

跟着cherno手搓游戏引擎【21】shaderLibrary(shader管理类)

前置:

ytpch.h:

  1. #pragma once
  2. #include<iostream>
  3. #include<memory>
  4. #include<utility>
  5. #include<algorithm>
  6. #include<functional>
  7. #include<string>
  8. #include<vector>
  9. #include<unordered_map>
  10. #include<unordered_set>
  11. #include<sstream>
  12. #include<array>
  13. #ifdef YT_PLATFORM_WINDOWS
  14. #include<Windows.h>
  15. #endif // YT_PLATFORM_WINDOWS

创建glsl文件:

 

Texture.glsl:

  1. #type vertex
  2. #version 330 core
  3. layout(location = 0) in vec3 a_Position;
  4. layout(location = 1) in vec2 a_TexCoord;
  5. uniform mat4 u_ViewProjection;
  6. uniform mat4 u_Transform;
  7. out vec2 v_TexCoord;
  8. out vec3 v_Position;
  9. void main(){
  10. v_TexCoord=a_TexCoord;
  11. v_Position=a_Position;
  12. gl_Position =u_ViewProjection*u_Transform*vec4( a_Position,1.0);
  13. }
  14. #type fragment
  15. #version 330 core
  16. layout(location = 0) out vec4 color;
  17. in vec3 v_Position;
  18. in vec2 v_TexCoord;
  19. uniform sampler2D u_Texture ;
  20. void main(){
  21. color = texture(u_Texture, v_TexCoord);
  22. }

抽象:

Shader.h:

  1. #pragma once
  2. #include <string>
  3. #include"YOTO/Core.h"
  4. namespace YOTO {
  5. class Shader {
  6. public:
  7. virtual~Shader()=default;
  8. virtual void Bind()const=0;
  9. virtual void UnBind()const=0;
  10. virtual const std::string& GetName()const = 0;
  11. static Ref<Shader> Create(const std::string& filepath);
  12. static Ref<Shader> Create(const std::string&name, const std::string& vertexSrc, const std::string& fragmentSrc);
  13. };
  14. class ShaderLibrary {
  15. public:
  16. void Add(const Ref<Shader>& shader);
  17. void Add(const std::string &name,const Ref<Shader>& shader);
  18. Ref<Shader> Load(const std::string filepath);
  19. Ref<Shader> Load(const std::string &name,const std::string filepath);
  20. Ref<Shader> Get(const std::string& name);
  21. bool Exists(const std::string& name);
  22. private:
  23. std::unordered_map<std::string,Ref<Shader>> m_Shaders;
  24. };
  25. }

Shader.cpp:

  1. #include "ytpch.h"
  2. #include "Shader.h"
  3. #include"Renderer.h"
  4. #include "Platform/OpenGL/OpenGLShader.h"
  5. namespace YOTO {
  6. Ref<Shader> Shader::Create(const std::string& filepath)
  7. {
  8. switch (Renderer::GetAPI())
  9. {
  10. case RendererAPI::API::None:
  11. YT_CORE_ASSERT(false, "Shader:API为None不支持");
  12. return nullptr;
  13. case RendererAPI::API::OpenGL:
  14. return std::make_shared <OpenGLShader>(filepath);
  15. }
  16. YT_CORE_ASSERT(false, "Buffer:未知API");
  17. return nullptr;
  18. }
  19. Ref<Shader> Shader::Create(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc)
  20. {
  21. switch (Renderer::GetAPI())
  22. {
  23. case RendererAPI::API::None:
  24. YT_CORE_ASSERT(false, "Shader:API为None不支持");
  25. return nullptr;
  26. case RendererAPI::API::OpenGL:
  27. return std::make_shared <OpenGLShader>(name,vertexSrc, fragmentSrc);
  28. }
  29. YT_CORE_ASSERT(false, "Buffer:未知API");
  30. return nullptr;
  31. }
  32. void ShaderLibrary::Add(const Ref<Shader>& shader)
  33. {
  34. auto& name = shader->GetName();
  35. Add(name, shader);
  36. }
  37. void ShaderLibrary::Add(const std::string& name, const Ref<Shader>& shader)
  38. {
  39. YT_CORE_ASSERT(!Exists(name), "ShaderLibrary:shader已经存在了")
  40. m_Shaders[name] = shader;
  41. }
  42. Ref<Shader> ShaderLibrary::Load(const std::string filepath)
  43. {
  44. auto shader = Shader::Create(filepath);
  45. Add(shader);
  46. return shader;
  47. }
  48. Ref<Shader> ShaderLibrary::Load(const std::string& name, const std::string filepath)
  49. {
  50. auto shader = Shader::Create(filepath);
  51. Add(shader);
  52. return shader;
  53. }
  54. Ref<Shader> ShaderLibrary::Get(const std::string& name)
  55. {YT_CORE_ASSERT(Exists(name),"ShaderLibrary:未找到shader")
  56. return m_Shaders[name];
  57. }
  58. bool ShaderLibrary::Exists(const std::string& name)
  59. {
  60. return m_Shaders.find(name)!=m_Shaders.end();
  61. }
  62. }

实现:

OpenGLShader.h:

  1. #pragma once
  2. #include <string>
  3. #include "YOTO/Renderer/Shader.h"
  4. #include <glm/glm.hpp>
  5. typedef unsigned int GLenum;
  6. namespace YOTO {
  7. class OpenGLShader:public Shader {
  8. public:
  9. OpenGLShader(const std::string& filepath);
  10. OpenGLShader(const std::string &name,const std::string& vertexSrc, const std::string& fragmentSrc);
  11. ~OpenGLShader();
  12. void Bind()const override;
  13. void UnBind()const override;
  14. virtual const std::string& GetName()const override { return m_Name; }
  15. void UploadUniformMat4(const std::string& name, const glm::mat4& matrix);
  16. void UploadUniformMat3(const std::string& name, const glm::mat3& matrix);
  17. void UploadUniformFloat4(const std::string& name, const glm::vec4& values);
  18. void UploadUniformFloat3(const std::string& name, const glm::vec3& values);
  19. void UploadUniformFloat2(const std::string& name, const glm::vec2& values);
  20. void UploadUniformFloat(const std::string& name, float values);
  21. void UploadUniformInt(const std::string& name, int values);
  22. private:
  23. std::string ReadFile(const std::string filepath);
  24. std::unordered_map<GLenum,std::string> PreProcess(const std::string& source);
  25. void Compile(const std::unordered_map<GLenum, std::string>& shaderSources);
  26. private:
  27. uint32_t m_RendererID;
  28. std::string m_Name;
  29. }
  30. ;
  31. }

OpenGLShader.cpp:

  1. #include "ytpch.h"
  2. #include "OpenGLShader.h"
  3. #include <glad/glad.h>
  4. #include <YOTO/Log.h>
  5. #include<glm/gtc/type_ptr.hpp>
  6. namespace YOTO {
  7. static GLenum ShaderTypeFromString(const std::string& type) {
  8. if (type == "vertex") {
  9. return GL_VERTEX_SHADER;
  10. }
  11. if (type == "fragment" || type == "pixel") {
  12. return GL_FRAGMENT_SHADER;
  13. }
  14. YT_CORE_ASSERT(false, "不知道的shader类型");
  15. return 0;
  16. }
  17. OpenGLShader::OpenGLShader(const std::string& filepath)
  18. {
  19. std::string source = ReadFile(filepath);
  20. YT_CORE_ASSERT(source.size(), "GLSL读取的字符串为空");
  21. auto shaderSources = PreProcess(source);
  22. Compile(shaderSources);
  23. auto lastSlash = filepath.find_last_of("/\\");
  24. lastSlash = lastSlash == std::string::npos ? 0 : lastSlash + 1;
  25. auto lastDot = filepath.rfind('.');
  26. auto count = lastDot == std::string::npos ? filepath.size() - lastSlash : lastDot - lastSlash;
  27. m_Name=filepath.substr(lastSlash, count);
  28. }
  29. OpenGLShader::OpenGLShader(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc)
  30. :m_Name(name){
  31. std::unordered_map<GLenum, std::string >sources;
  32. sources[GL_VERTEX_SHADER] = vertexSrc;
  33. sources[GL_FRAGMENT_SHADER] = fragmentSrc;
  34. Compile(sources);
  35. }
  36. OpenGLShader::~OpenGLShader()
  37. {
  38. glDeleteProgram(m_RendererID);
  39. }
  40. std::string OpenGLShader::ReadFile(const std::string filepath)
  41. {
  42. std::string result;
  43. std::ifstream in(filepath, std::ios::in | std::ios::binary);
  44. if (in) {
  45. in.seekg(0, std::ios::end); // 将指针放在最后面
  46. result.resize(in.tellg()); // 初始化string的大小, in.tellg()返回位置
  47. in.seekg(0, std::ios::beg); // in指回头部
  48. in.read(&result[0], result.size()); // in读入放在result指向的内存中
  49. }
  50. else {
  51. YT_CORE_ERROR("不能打开文件:{0}", filepath);
  52. }
  53. return result;
  54. }
  55. std::unordered_map<GLenum, std::string> OpenGLShader::PreProcess(const std::string& source)
  56. {
  57. std::unordered_map<GLenum, std::string> shaderSources;
  58. std::string typeToken = "#type";
  59. size_t typeTokenLen = typeToken.size();
  60. size_t findCurPos = source.find(typeToken, 0);
  61. size_t findNextPos = findCurPos;
  62. while (findNextPos != std::string::npos) {
  63. size_t curlineEndPos = source.find_first_of("\r\n", findCurPos);///r/n写错为/r/n
  64. YT_CORE_ASSERT(curlineEndPos != std::string::npos, "解析shader失败");
  65. size_t begin = findCurPos + typeTokenLen + 1;
  66. std::string type = source.substr(begin, curlineEndPos - begin);// 获取到是vertex还是fragment
  67. YT_CORE_ASSERT(ShaderTypeFromString(type), "无效的shader的类型 ");
  68. size_t nextLinePos = source.find_first_not_of("\r\n", curlineEndPos);
  69. findNextPos = source.find(typeToken, nextLinePos);
  70. // 获取到具体的shader代码
  71. shaderSources[ShaderTypeFromString(type)] = source.substr(nextLinePos, findNextPos - (nextLinePos == std::string::npos ? source.size() - 1 : nextLinePos));
  72. findCurPos = findNextPos;
  73. }
  74. return shaderSources;
  75. /*
  76. 用find,而不是find_firtst_of,因为
  77. find返回完全匹配的字符串的的位置;
  78. find_first_of返回被查匹配字符串中某个字符的第一次出现位置。
  79. std::string::npos是一个非常大的数
  80. source.substr(0, source.size() + 10000)截取到从头到末尾,不会报错
  81. */
  82. }
  83. void OpenGLShader::Compile(const std::unordered_map<GLenum, std::string>& shaderSources)
  84. {
  85. GLuint program = glCreateProgram();
  86. YT_CORE_ASSERT(shaderSources.size()<=2,"OpenGLShader:shader只支持两种!")
  87. std::array<GLenum,2>glShaderIDs;
  88. int glShaderIDIndex=0;
  89. for (auto& kv : shaderSources) {
  90. GLenum type = kv.first;
  91. const std::string& source = kv.second;
  92. // Create an empty vertex shader handle
  93. GLuint shader = glCreateShader(type);
  94. // Send the vertex shader source code to GL
  95. // Note that std::string's .c_str is NULL character terminated.
  96. const GLchar* sourceCStr = source.c_str();
  97. glShaderSource(shader, 1, &sourceCStr, 0);
  98. // Compile the vertex shader
  99. glCompileShader(shader);
  100. GLint isCompiled = 0;
  101. glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
  102. if (isCompiled == GL_FALSE)
  103. {
  104. GLint maxLength = 0;
  105. glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
  106. // The maxLength includes the NULL character
  107. std::vector<GLchar> infoLog(maxLength);
  108. glGetShaderInfoLog(shader, maxLength, &maxLength, &infoLog[0]);
  109. // We don't need the shader anymore.
  110. glDeleteShader(shader);
  111. // Use the infoLog as you see fit.
  112. // In this simple program, we'll just leave
  113. YT_CORE_ERROR("{0} ", infoLog.data());
  114. YT_CORE_ASSERT(false, "shader 编译失败!");
  115. break;
  116. }
  117. // Attach our shaders to our program
  118. glAttachShader(program, shader);
  119. glShaderIDs[glShaderIDIndex++]=shader;
  120. }
  121. // Link our program
  122. glLinkProgram(program);
  123. // Note the different functions here: glGetProgram* instead of glGetShader*.
  124. GLint isLinked = 0;
  125. glGetProgramiv(program, GL_LINK_STATUS, (int*)&isLinked);
  126. if (isLinked == GL_FALSE)
  127. {
  128. GLint maxLength = 0;
  129. glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
  130. // The maxLength includes the NULL character
  131. std::vector<GLchar> infoLog(maxLength);
  132. glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
  133. // We don't need the program anymore.
  134. glDeleteProgram(program);
  135. // Don't leak shaders either.
  136. for (auto id : glShaderIDs) {
  137. glDeleteShader(id);
  138. }
  139. // Use the infoLog as you see fit.
  140. // In this simple program, we'll just leave
  141. YT_CORE_ERROR("{0} ", infoLog.data());
  142. YT_CORE_ASSERT(false, "shader link failure!");
  143. return;
  144. }
  145. // Always detach shaders after a successful link.
  146. for (auto id : glShaderIDs) {
  147. glDetachShader(program, id);
  148. }
  149. m_RendererID = program;
  150. }
  151. void OpenGLShader::Bind() const
  152. {
  153. glUseProgram(m_RendererID);
  154. }
  155. void OpenGLShader::UnBind() const
  156. {
  157. glUseProgram(0);
  158. }
  159. void OpenGLShader::UploadUniformMat4(const std::string& name, const glm::mat4& matrix)
  160. {
  161. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  162. glUniformMatrix4fv(loacation, 1, GL_FALSE, glm::value_ptr(matrix));
  163. }
  164. void OpenGLShader::UploadUniformMat3(const std::string& name, const glm::mat3& matrix)
  165. {
  166. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  167. glUniformMatrix3fv(loacation, 1, GL_FALSE, glm::value_ptr(matrix));
  168. }
  169. void OpenGLShader::UploadUniformFloat4(const std::string& name, const glm::vec4& values)
  170. {
  171. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  172. glUniform4f(loacation, values.x, values.y, values.z, values.w);
  173. }
  174. void OpenGLShader::UploadUniformFloat3(const std::string& name, const glm::vec3& values)
  175. {
  176. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  177. glUniform3f(loacation, values.x, values.y, values.z);
  178. }
  179. void OpenGLShader::UploadUniformFloat2(const std::string& name, const glm::vec2& values)
  180. {
  181. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  182. glUniform2f(loacation, values.x, values.y);
  183. }
  184. void OpenGLShader::UploadUniformFloat(const std::string& name, float values)
  185. {
  186. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  187. glUniform1f(loacation, values);
  188. }
  189. void OpenGLShader::UploadUniformInt(const std::string& name, int values)
  190. {
  191. GLint loacation = glGetUniformLocation(m_RendererID, name.c_str());
  192. glUniform1i(loacation, values);
  193. }
  194. }

调用:

SandboxApp.cpp:

  1. #include<YOTO.h>
  2. #include "imgui/imgui.h"
  3. #include<stdio.h>
  4. #include <glm/gtc/matrix_transform.hpp>
  5. #include <Platform/OpenGL/OpenGLShader.h>
  6. #include <glm/gtc/type_ptr.hpp>
  7. class ExampleLayer:public YOTO::Layer
  8. {
  9. public:
  10. ExampleLayer()
  11. :Layer("Example"), m_Camera(-2.0f, 2.0f, -2.0f, 2.0f), m_CameraPosition(0){
  12. uint32_t indices[3] = { 0,1,2 };
  13. float vertices[3 * 7] = {
  14. -0.5f,-0.5f,0.0f, 0.8f,0.2f,0.8f,1.0f,
  15. 0.5f,-0.5f,0.0f, 0.2f,0.3f,0.8f,1.0f,
  16. 0.0f,0.5f,0.0f, 0.8f,0.8f,0.2f,1.0f,
  17. };
  18. m_VertexArray.reset(YOTO::VertexArray::Create());
  19. YOTO::Ref<YOTO::VertexBuffer> m_VertexBuffer;
  20. m_VertexBuffer.reset(YOTO::VertexBuffer::Create(vertices, sizeof(vertices)));
  21. {
  22. YOTO::BufferLayout setlayout = {
  23. {YOTO::ShaderDataType::Float3,"a_Position"},
  24. {YOTO::ShaderDataType::Float4,"a_Color"}
  25. };
  26. m_VertexBuffer->SetLayout(setlayout);
  27. }
  28. m_VertexArray->AddVertexBuffer(m_VertexBuffer);
  29. YOTO::Ref<YOTO::IndexBuffer>m_IndexBuffer;
  30. m_IndexBuffer.reset(YOTO::IndexBuffer::Create(indices, sizeof(indices) / sizeof(uint32_t)));
  31. m_VertexArray->AddIndexBuffer(m_IndexBuffer);
  32. std::string vertexSource = R"(
  33. #version 330 core
  34. layout(location = 0) in vec3 a_Position;
  35. layout(location = 1) in vec4 a_Color;
  36. uniform mat4 u_ViewProjection;
  37. uniform mat4 u_Transform;
  38. out vec3 v_Position;
  39. out vec4 v_Color;
  40. void main(){
  41. v_Position=a_Position;
  42. v_Color=a_Color;
  43. gl_Position =u_ViewProjection *u_Transform* vec4( a_Position,1.0);
  44. }
  45. )";
  46. //绘制颜色
  47. std::string fragmentSource = R"(
  48. #version 330 core
  49. layout(location = 0) out vec4 color;
  50. in vec3 v_Position;
  51. in vec4 v_Color;
  52. void main(){
  53. color=vec4(v_Color);
  54. }
  55. )";
  56. m_Shader=(YOTO::Shader::Create("VertexPosColor", vertexSource, fragmentSource));
  57. ///测试/
  58. m_SquareVA.reset(YOTO::VertexArray::Create());
  59. float squareVertices[5 * 4] = {
  60. -0.5f,-0.5f,0.0f, 0.0f,0.0f,
  61. 0.5f,-0.5f,0.0f, 1.0f,0.0f,
  62. 0.5f,0.5f,0.0f, 1.0f,1.0f,
  63. -0.5f,0.5f,0.0f, 0.0f,1.0f,
  64. };
  65. YOTO::Ref<YOTO::VertexBuffer> squareVB;
  66. squareVB.reset(YOTO::VertexBuffer::Create(squareVertices, sizeof(squareVertices)));
  67. squareVB->SetLayout({
  68. {YOTO::ShaderDataType::Float3,"a_Position"},
  69. {YOTO::ShaderDataType::Float2,"a_TexCoord"}
  70. });
  71. m_SquareVA->AddVertexBuffer(squareVB);
  72. uint32_t squareIndices[6] = { 0,1,2,2,3,0 };
  73. YOTO::Ref<YOTO::IndexBuffer> squareIB;
  74. squareIB.reset((YOTO::IndexBuffer::Create(squareIndices, sizeof(squareIndices) / sizeof(uint32_t))));
  75. m_SquareVA->AddIndexBuffer(squareIB);
  76. //测试:
  77. std::string BlueShaderVertexSource = R"(
  78. #version 330 core
  79. layout(location = 0) in vec3 a_Position;
  80. uniform mat4 u_ViewProjection;
  81. uniform mat4 u_Transform;
  82. out vec3 v_Position;
  83. void main(){
  84. v_Position=a_Position;
  85. gl_Position =u_ViewProjection*u_Transform*vec4( a_Position,1.0);
  86. }
  87. )";
  88. //绘制颜色
  89. std::string BlueShaderFragmentSource = R"(
  90. #version 330 core
  91. layout(location = 0) out vec4 color;
  92. in vec3 v_Position;
  93. uniform vec3 u_Color;
  94. void main(){
  95. color=vec4(u_Color,1.0);
  96. }
  97. )";
  98. m_BlueShader=(YOTO::Shader::Create("FlatColor", BlueShaderVertexSource, BlueShaderFragmentSource));
  99. auto textureShader= m_ShaderLibrary.Load("assets/shaders/Texture.glsl");
  100. m_Texture=YOTO::Texture2D::Create("assets/textures/Checkerboard.png");
  101. m_ChernoLogo= YOTO::Texture2D::Create("assets/textures/ChernoLogo.png");
  102. std::dynamic_pointer_cast<YOTO::OpenGLShader>(textureShader)->Bind();
  103. std::dynamic_pointer_cast<YOTO::OpenGLShader>(textureShader)->UploadUniformInt("u_Texture", 0);
  104. }
  105. void OnImGuiRender() override {
  106. ImGui::Begin("设置");
  107. ImGui::ColorEdit3("正方形颜色", glm::value_ptr(m_SquareColor));
  108. ImGui::End();
  109. }
  110. void OnUpdate(YOTO::Timestep ts)override {
  111. //YT_CLIENT_TRACE("delta time {0}s ({1}ms)", ts.GetSeconds(), ts.GetMilliseconds());
  112. if (YOTO::Input::IsKeyPressed(YT_KEY_LEFT)) {
  113. m_CameraPosition.x -= m_CameraMoveSpeed* ts;
  114. }
  115. else if (YOTO::Input::IsKeyPressed(YT_KEY_RIGHT)) {
  116. m_CameraPosition.x += m_CameraMoveSpeed * ts;
  117. }
  118. if (YOTO::Input::IsKeyPressed(YT_KEY_DOWN)) {
  119. m_CameraPosition.y -= m_CameraMoveSpeed * ts;
  120. }
  121. else if (YOTO::Input::IsKeyPressed(YT_KEY_UP)) {
  122. m_CameraPosition.y += m_CameraMoveSpeed * ts;
  123. }
  124. if (YOTO::Input::IsKeyPressed(YT_KEY_A)) {
  125. m_CameraRotation += m_CameraRotationSpeed * ts;
  126. }else if (YOTO::Input::IsKeyPressed(YT_KEY_D)) {
  127. m_CameraRotation -= m_CameraRotationSpeed * ts;
  128. }
  129. YOTO::RenderCommand::SetClearColor({ 0.2f, 0.2f, 0.2f, 1.0f });
  130. YOTO::RenderCommand::Clear();
  131. m_Camera.SetPosition(m_CameraPosition);
  132. m_Camera.SetRotation(m_CameraRotation);
  133. YOTO::Renderer::BeginScene(m_Camera);
  134. {
  135. static glm::mat4 scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.1f));
  136. glm::vec4 redColor(0.8f, 0.3f, 0.3f, 1.0f);
  137. glm::vec4 blueColor(0.2f, 0.3f, 0.8f, 1.0f);
  138. /* YOTO::MaterialRef material = new YOTO::MaterialRef(m_FlatColorShader);
  139. YOTO::MaterialInstaceRef mi = new YOTO::MaterialInstaceRef(material);
  140. mi.setValue("u_Color",redColor);
  141. mi.setTexture("u_AlbedoMap", texture);
  142. squreMesh->SetMaterial(mi);*/
  143. std::dynamic_pointer_cast<YOTO::OpenGLShader>(m_BlueShader)->Bind();
  144. std::dynamic_pointer_cast<YOTO::OpenGLShader>(m_BlueShader)->UploadUniformFloat3("u_Color",m_SquareColor);
  145. for (int y = 0; y < 20; y++) {
  146. for (int x = 0; x <20; x++)
  147. {
  148. glm::vec3 pos(x * 0.105f,y* 0.105f, 0.0);
  149. glm::mat4 transform = glm::translate(glm::mat4(1.0f), pos) * scale;
  150. /*if (x % 2 == 0) {
  151. m_BlueShader->UploadUniformFloat4("u_Color", redColor);
  152. }
  153. else {
  154. m_BlueShader->UploadUniformFloat4("u_Color", blueColor);
  155. }*/
  156. YOTO::Renderer::Submit(m_BlueShader, m_SquareVA, transform);
  157. }
  158. }
  159. auto textureShader = m_ShaderLibrary.Get("Texture");
  160. m_Texture->Bind();
  161. YOTO::Renderer::Submit(textureShader, m_SquareVA, glm::scale(glm::mat4(1.0f), glm::vec3(1.5f)));
  162. m_ChernoLogo->Bind();
  163. YOTO::Renderer::Submit(textureShader, m_SquareVA, glm::scale(glm::mat4(1.0f), glm::vec3(1.5f)));
  164. //YOTO::Renderer::Submit(m_Shader, m_VertexArray);
  165. YOTO::Renderer::EndScene();
  166. }
  167. }
  168. void OnEvent(YOTO::Event& event)override {
  169. /*if (event.GetEventType() == YOTO::EventType::KeyPressed) {
  170. YOTO:: KeyPressedEvent& e = (YOTO::KeyPressedEvent&)event;
  171. YT_CLIENT_TRACE("ExampleLayer:{0}",(char)e.GetKeyCode());
  172. if (e.GetKeyCode()==YT_KEY_TAB) {
  173. YT_CLIENT_INFO("ExampleLayerOnEvent:TAB按下了");
  174. }}*/
  175. //YT_CLIENT_TRACE("SandBoxApp:测试event{0}", event);
  176. }
  177. private:
  178. YOTO::ShaderLibrary m_ShaderLibrary;
  179. YOTO::Ref<YOTO::Shader> m_Shader;
  180. YOTO::Ref<YOTO::VertexArray> m_VertexArray;
  181. YOTO::Ref<YOTO::Shader> m_BlueShader;
  182. YOTO::Ref<YOTO::VertexArray> m_SquareVA;
  183. YOTO::Ref<YOTO::Texture2D> m_Texture,m_ChernoLogo;
  184. YOTO::OrthographicCamera m_Camera;
  185. glm::vec3 m_CameraPosition;
  186. float m_CameraMoveSpeed = 5.0f;
  187. float m_CameraRotation = 0;
  188. float m_CameraRotationSpeed = 180.0f;
  189. glm::vec3 m_SquareColor = { 0.2f,0.3f,0.7f };
  190. };
  191. class Sandbox:public YOTO::Application
  192. {
  193. public:
  194. Sandbox(){
  195. PushLayer(new ExampleLayer());
  196. //PushLayer(new YOTO::ImGuiLayer());
  197. }
  198. ~Sandbox() {
  199. }
  200. private:
  201. };
  202. YOTO::Application* YOTO::CreateApplication() {
  203. printf("helloworld");
  204. return new Sandbox();
  205. }

测试:

cool! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/86435
推荐阅读
相关标签
  

闽ICP备14008679号