diff options
author | chai <chaifix@163.com> | 2021-10-28 16:24:34 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-28 16:24:34 +0800 |
commit | 40d40edcdeef4978a0d9c7333b7007d1fa4c0bc6 (patch) | |
tree | 5b96c37f9bd85dd0be7a8b880a1de24914ae2880 /Runtime/Graphics/Shader.cpp | |
parent | 92dd401d75e19281dc7a01492ab3c0996de330fc (diff) |
*misc
Diffstat (limited to 'Runtime/Graphics/Shader.cpp')
-rw-r--r-- | Runtime/Graphics/Shader.cpp | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/Runtime/Graphics/Shader.cpp b/Runtime/Graphics/Shader.cpp index b8b9e33..3d4a374 100644 --- a/Runtime/Graphics/Shader.cpp +++ b/Runtime/Graphics/Shader.cpp @@ -2,12 +2,15 @@ #include "Runtime/Debug/log.h" #include "Shader.h" #include "OpenGL.h" +#include "ShaderCompiler.h" +using namespace std; + +std::string shaderError = ""; void checkCompileshaderErrorors(GLuint shader, std::string type) { GLint success; GLchar infoLog[1024]; - std::string shaderError = ""; if (type != "PROGRAM") { glGetShaderiv(shader, GL_COMPILE_STATUS, &success); @@ -28,7 +31,7 @@ void checkCompileshaderErrorors(GLuint shader, std::string type) } if (!success) { - throw ShaderCompileExecption(shaderError); + throw ShaderCompileExecption(shaderError.c_str()); } } @@ -38,34 +41,57 @@ Shader::Shader(LuaBind::VM*vm, bool keepSrc) { } -Shader::Shader(LuaBind::VM* vm, std::string& vert, std::string& frag, bool keepSrc) +Shader::Shader(LuaBind::VM*vm, std::string& glslShader, bool keepSrc) + : NativeClass<Shader>(vm) + , m_KeepSrc(keepSrc) +{ + // stl的string会在大小超过阈值的情况下在栈里分配,并用RAII保证释放 + std::string vsh ; + std::string fsh ; + try + { + GLSLCompiler::Compile(glslShader, vsh, fsh); + } + catch (GLSLCompileException& e) + { + throw ShaderCompileExecption(e.what()); + } + CompileProgram(vsh.c_str(), fsh.c_str(), keepSrc); +} + +Shader::Shader(LuaBind::VM* vm, const char* vert, const char* frag, bool keepSrc) : NativeClass<Shader>(vm) , m_KeepSrc(keepSrc) { - const char* vertCode = vert.c_str(); - const char* fragCode = frag.c_str(); - // vertex shader - m_VertID = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(m_VertID, 1, &vertCode, NULL); - glCompileShader(m_VertID); - checkCompileshaderErrorors(m_VertID, "VERTEX"); - // fragment Shader - m_FragID = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(m_FragID, 1, &fragCode, NULL); - glCompileShader(m_FragID); - checkCompileshaderErrorors(m_FragID, "FRAGMENT"); - // create program - m_ProgramID = glCreateProgram(); - glAttachShader(m_ProgramID, m_VertID); - glAttachShader(m_ProgramID, m_FragID); - glLinkProgram(m_ProgramID); - checkCompileshaderErrorors(m_FragID, "PROGRAM"); - // keep src - if (keepSrc) - { - m_VertSrc = vert; - m_FragSrc = frag; - } + CompileProgram(vert, frag, keepSrc); +} + +void Shader::CompileProgram(const char* vert, const char* frag, bool keepSrc) +{ + const char* vertCode = vert; + const char* fragCode = frag; + // vertex shader + m_VertID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(m_VertID, 1, &vertCode, NULL); + glCompileShader(m_VertID); + checkCompileshaderErrorors(m_VertID, "VERTEX"); + // fragment Shader + m_FragID = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(m_FragID, 1, &fragCode, NULL); + glCompileShader(m_FragID); + checkCompileshaderErrorors(m_FragID, "FRAGMENT"); + // create program + m_ProgramID = glCreateProgram(); + glAttachShader(m_ProgramID, m_VertID); + glAttachShader(m_ProgramID, m_FragID); + glLinkProgram(m_ProgramID); + checkCompileshaderErrorors(m_FragID, "PROGRAM"); + // keep src + if (keepSrc) + { + m_VertSrc = vert; + m_FragSrc = frag; + } } Shader::~Shader() |