summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/shader.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-06-08 08:34:52 +0800
committerchai <chaifix@163.com>2019-06-08 08:34:52 +0800
commitd7a972a0f16da0fd7bf4c0b70913920216ff3113 (patch)
treea9146629cbf513200462c3f1223a9e07f3e01862 /source/modules/asura-core/graphics/shader.cpp
parent8bfe54676f728076a92d802bb5d064e58265c8f2 (diff)
*misc
Diffstat (limited to 'source/modules/asura-core/graphics/shader.cpp')
-rw-r--r--source/modules/asura-core/graphics/shader.cpp97
1 files changed, 60 insertions, 37 deletions
diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp
index 866c4da..afd10b0 100644
--- a/source/modules/asura-core/graphics/shader.cpp
+++ b/source/modules/asura-core/graphics/shader.cpp
@@ -21,74 +21,97 @@ namespace AsuraEngine
Shader::~Shader()
{
- if(mVertShader != 0)
- glDeleteShader(mVertShader);
- if(mFragShader != 0)
- glDeleteShader(mFragShader);
- if(mProgram != 0)
- glDeleteProgram(mProgram);
+ if(mVertShader) glDeleteShader(mVertShader);
+ if(mFragShader) glDeleteShader(mFragShader);
+ if(mProgram) glDeleteProgram(mProgram);
}
bool Shader::Load(const string& vert, const string& frag)
{
- GLenum err = GL_NO_ERROR;
- GLint success;
string warnning = "";
- if (mProgram == 0)
+ if (!mProgram)
{
mProgram = glCreateProgram();
- if (mProgram == 0)
+ if (!mProgram)
throw Exception("Cannot create OpenGL shader program.");
}
- if (mVertShader == 0)
+ if (!CompileVertexShader(vert, warnning))
{
- mVertShader = glCreateShader(GL_VERTEX_SHADER);
- if (mVertShader == 0)
- throw Exception("Cannot create OpenGL vertex shader.");
+ throw Exception("Compile vertex shader failed:%s", warnning);
}
- if (mFragShader == 0)
+ if (!CompileFragementShader(frag, warnning))
{
- mFragShader = glCreateShader(GL_FRAGMENT_SHADER);
- if(mFragShader == 0)
- throw Exception("Cannot create OpenGL fragment shader.");
+ throw Exception("Compile fragment shader failed:%s", warnning);
}
- const GLchar* source;
+ glAttachShader(mProgram, mVertShader);
+ glAttachShader(mProgram, mFragShader);
+
+ glLinkProgram(mProgram);
+ GLint success;
+ glGetProgramiv(mProgram, GL_LINK_STATUS, &success);
+ if (success == GL_FALSE)
+ {
+ warnning = GetProgramWarnings();
+ throw Exception("Link shader program failed:\n%s", warnning.c_str());
+ }
+
+ return true;
+ }
+
+ bool Shader::CompileVertexShader(const string& vert, string& outError)
+ {
+ if (!mVertShader)
+ {
+ mVertShader = glCreateShader(GL_VERTEX_SHADER);
+ if (!mVertShader)
+ {
+ outError = "Cannot create OpenGL Vertex shader.";
+ return false;
+ }
+ }
+
+ const GLchar* source = vert.c_str();
+ GLint success;
- // Compile vertex shader.
- source = vert.c_str();
glShaderSource(mVertShader, 1, &source, NULL);
glCompileShader(mVertShader);
glGetShaderiv(mVertShader, GL_COMPILE_STATUS, &success);
if (success == GL_FALSE)
{
- warnning = GetShaderWarnings(mVertShader);
- throw Exception("Compile vertex shader failed:\n%s", warnning.c_str());
+ outError = GetShaderWarnings(mVertShader);
+ return false;
}
- // Compile fragment shader.
+ return true;
+ }
+
+ bool Shader::CompileFragementShader(const string& frag, string& outError)
+ {
+ if (!mFragShader)
+ {
+ mFragShader = glCreateShader(GL_FRAGMENT_SHADER);
+ if (!mFragShader)
+ {
+ outError = "Cannot create OpenGL fragment shader.";
+ return false;
+ }
+ }
+
+ const GLchar* source = frag.c_str();
+ GLint success;
+
source = frag.c_str();
glShaderSource(mFragShader, 1, &source, NULL);
glCompileShader(mFragShader);
glGetShaderiv(mFragShader, GL_COMPILE_STATUS, &success);
if (success == GL_FALSE)
{
- warnning = GetShaderWarnings(mFragShader);
- throw Exception("Compile fragment shader failed:\n%s", warnning.c_str());
- }
-
- // Link program.
- glAttachShader(mProgram, mVertShader);
- glAttachShader(mProgram, mFragShader);
- glLinkProgram(mProgram);
- glGetProgramiv(mProgram, GL_LINK_STATUS, &success);
- if (success == GL_FALSE)
- {
- warnning = GetProgramWarnings();
- throw Exception("Link shader program failed:\n%s", warnning.c_str());
+ outError = GetShaderWarnings(mFragShader);
+ return false;
}
return true;