summaryrefslogtreecommitdiff
path: root/Runtime/Graphics/Shader.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-10-28 16:24:34 +0800
committerchai <chaifix@163.com>2021-10-28 16:24:34 +0800
commit40d40edcdeef4978a0d9c7333b7007d1fa4c0bc6 (patch)
tree5b96c37f9bd85dd0be7a8b880a1de24914ae2880 /Runtime/Graphics/Shader.cpp
parent92dd401d75e19281dc7a01492ab3c0996de330fc (diff)
*misc
Diffstat (limited to 'Runtime/Graphics/Shader.cpp')
-rw-r--r--Runtime/Graphics/Shader.cpp80
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()