From 740b10240414ae3b7c37ee21fd131ffdb296b2b9 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 10 Dec 2015 02:59:18 +0300 Subject: Add function for load OpenGL ES 2 shaders. --- src/defaults.cpp | 2 ++ src/render/shaders/shadersmanager.cpp | 19 ++++++++++++++++--- src/render/shaders/shadersmanager.h | 5 ++++- src/resources/resourcemanager.cpp | 10 +++++++--- src/resources/resourcemanager.h | 3 ++- 5 files changed, 31 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/defaults.cpp b/src/defaults.cpp index a301d2323..16cab02a6 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -501,6 +501,8 @@ DefaultsData* getPathsDefaults() AddDEF("simpleVertexShader", "simple_vertex.glsl"); AddDEF("simpleFragmentShader", "simple_frag.glsl"); + AddDEF("gles2VertexShader", "gles2_vertex.glsl"); + AddDEF("gles2FragmentShader", "gles2_frag.glsl"); AddDEF("particles", "graphics/particles/"); AddDEF("portalEffectFile", "warparea.particle.xml"); diff --git a/src/render/shaders/shadersmanager.cpp b/src/render/shaders/shadersmanager.cpp index 345093074..c79abe2cc 100644 --- a/src/render/shaders/shadersmanager.cpp +++ b/src/render/shaders/shadersmanager.cpp @@ -63,7 +63,8 @@ Shader *ShadersManager::createShader(const unsigned int type, } ShaderProgram *ShadersManager::createProgram(const std::string &vertex, - const std::string &fragment) + const std::string &fragment, + const bool isNewShader) { Shader *const vertexShader = static_cast( resourceManager->getShader(GL_VERTEX_SHADER, vertex)); @@ -89,7 +90,10 @@ ShaderProgram *ShadersManager::createProgram(const std::string &vertex, mglAttachShader(programId, vertexShader->getShaderId()); mglAttachShader(programId, fragmentShader->getShaderId()); - mglBindFragDataLocation(programId, 0, "outColor"); + if (isNewShader) + mglBindFragDataLocation(programId, 0, "outColor"); + else + mglBindAttribLocation(programId, 0, "position"); mglLinkProgram(programId); GLint isLinked = 0; mglGetProgramiv(programId, GL_LINK_STATUS, &isLinked); @@ -122,7 +126,16 @@ ShaderProgram *ShadersManager::getSimpleProgram() { const std::string dir = paths.getStringValue("shaders"); return createProgram(dir + paths.getStringValue("simpleVertexShader"), - dir + paths.getStringValue("simpleFragmentShader")); + dir + paths.getStringValue("simpleFragmentShader"), + true); +} + +ShaderProgram *ShadersManager::getGles2Program() +{ + const std::string dir = paths.getStringValue("shaders"); + return createProgram(dir + paths.getStringValue("gles2VertexShader"), + dir + paths.getStringValue("gles2FragmentShader"), + false); } #endif diff --git a/src/render/shaders/shadersmanager.h b/src/render/shaders/shadersmanager.h index 6c71dba17..b0cf56159 100644 --- a/src/render/shaders/shadersmanager.h +++ b/src/render/shaders/shadersmanager.h @@ -37,10 +37,13 @@ class ShadersManager final const std::string &fileName) A_WARN_UNUSED; ShaderProgram *createProgram(const std::string &vertex, - const std::string &fragment) + const std::string &fragment, + const bool isNewShader) A_WARN_UNUSED; ShaderProgram *getSimpleProgram(); + + ShaderProgram *getGles2Program(); }; extern ShadersManager shaders; diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index f9f55ca03..bb566d9f4 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -763,6 +763,7 @@ struct ShaderProgramLoader final { const std::string vertex; const std::string fragment; + const bool isNewShader; static Resource *load(const void *const v) { @@ -772,15 +773,18 @@ struct ShaderProgramLoader final const ShaderProgramLoader *const rl = static_cast(v); ShaderProgram *const resource = shaders.createProgram( - rl->vertex, rl->fragment); + rl->vertex, + rl->fragment, + rl->isNewShader); return resource; } }; Resource *ResourceManager::getShaderProgram(const std::string &vertex, - const std::string &fragment) + const std::string &fragment, + const bool isNewShader) { - ShaderProgramLoader rl = { vertex, fragment }; + ShaderProgramLoader rl = { vertex, fragment, isNewShader }; return get("program_" + vertex + " + " + fragment, ShaderProgramLoader::load, &rl); } diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h index 13d05f0b2..329820246 100644 --- a/src/resources/resourcemanager.h +++ b/src/resources/resourcemanager.h @@ -181,7 +181,8 @@ class ResourceManager final const std::string &name) A_WARN_UNUSED; Resource *getShaderProgram(const std::string &vertex, - const std::string &fragment) A_WARN_UNUSED; + const std::string &fragment, + const bool isNewShader) A_WARN_UNUSED; #endif WalkLayer *getWalkLayer(const std::string &name, Map *const map); -- cgit v1.2.3-60-g2f50