diff options
author | Nobuhiko Tanibata <ntanibata@jp.adit-jv.com> | 2012-07-26 09:20:47 +0900 |
---|---|---|
committer | Michael Schuldt <michael.schuldt@bmw.de> | 2012-09-12 11:34:00 +0200 |
commit | 6724d78f8c2974b57b88a0e262788c5624275b38 (patch) | |
tree | aca292487c548da889f79280366e8052de3eecc8 | |
parent | 7f6993127fbbcc455dc4b9521d691e326a596466 (diff) | |
download | layer_management-6724d78f8c2974b57b88a0e262788c5624275b38.tar.gz |
Add implmentation of chromakey for surface by shader program to LayerMangerPlugin
LayerManagerService:
-Add parameter of chromakey to ShaderProgram in order to set chromakey to shaders
X11GLESRenderer:
-renderer_frag_add_uchromakey. If chromakey and fragment color are same, the pixel is ignored.
GLESGraphicSystem:
-If chromakey is enabled, shader for chromakey is enabled.
8 files changed, 106 insertions, 8 deletions
diff --git a/LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/GLESGraphicSystem.h b/LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/GLESGraphicSystem.h index 0ace94f..342ced5 100644 --- a/LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/GLESGraphicSystem.h +++ b/LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/GLESGraphicSystem.h @@ -1,6 +1,7 @@ /*************************************************************************** * * Copyright 2010,2011 BMW Car IT GmbH + * Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh * * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -84,6 +85,7 @@ protected: EGLBoolean m_blendingStatus; Shader* m_defaultShader; Shader* m_defaultShaderNoUniformAlpha; + Shader* m_defaultShaderAddUniformChromaKey; Layer* m_currentLayer; #ifdef DRAW_LAYER_DEBUG Shader* m_layerShader; diff --git a/LayerManagerPlugins/Renderers/Graphic/src/GraphicSystems/GLESGraphicSystem.cpp b/LayerManagerPlugins/Renderers/Graphic/src/GraphicSystems/GLESGraphicSystem.cpp index 56d72ae..cdee4ec 100644 --- a/LayerManagerPlugins/Renderers/Graphic/src/GraphicSystems/GLESGraphicSystem.cpp +++ b/LayerManagerPlugins/Renderers/Graphic/src/GraphicSystems/GLESGraphicSystem.cpp @@ -1,6 +1,7 @@ /*************************************************************************** * * Copyright 2010,2011 BMW Car IT GmbH + * Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh * * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -62,6 +63,7 @@ GLESGraphicsystem::GLESGraphicsystem(int windowWidth, int windowHeight, PfnShade , m_blendingStatus(false) , m_defaultShader(0) , m_defaultShaderNoUniformAlpha(0) +, m_defaultShaderAddUniformChromaKey(0) , m_currentLayer(0) #ifdef DRAW_LAYER_DEBUG , m_layerShader(0) @@ -298,14 +300,33 @@ Shader *GLESGraphicsystem::pickOptimizedShader(Shader* currentShader, const Shad { Shader * retShader = currentShader; - if (currentShader == m_defaultShader && curUniforms.opacity == 1.0f) + LOG_DEBUG("GLESGraphicsystem", "shader:currentShader"); + do { - //no need for multiply in shader, just use texture - retShader = m_defaultShaderNoUniformAlpha; - } + if (currentShader != m_defaultShader) + { + LOG_DEBUG("GLESGraphicsystem", "shader:default"); + break; + } - return retShader; + if (false == curUniforms.chromaKeyEnabled) + { + if (curUniforms.opacity == 1.0f) + { + //no need for multiply in shader, just use texture + retShader = m_defaultShaderNoUniformAlpha; + LOG_DEBUG("GLESGraphicsystem", "shader:defaultShaderNoUniformAlpha"); + } + } + else + { + // Add chromakey to default fragment shader + retShader = m_defaultShaderAddUniformChromaKey; + LOG_DEBUG("GLESGraphicsystem", "shader:defaultShaderAddUniformChromaKey"); + } + } while(0); + return retShader; } void GLESGraphicsystem::applyLayerMatrix(IlmMatrix& matrix) @@ -363,7 +384,17 @@ void GLESGraphicsystem::renderSurface(Surface* surface) uniforms.texOffset[1] = textureCoordinates[1]; uniforms.texUnit = 0; uniforms.matrix = &layerMatrix.f[0]; - + uniforms.chromaKeyEnabled = (surface)->getChromaKeyEnabled(); + if (true == uniforms.chromaKeyEnabled) + { + unsigned char red = 0; + unsigned char green = 0; + unsigned char blue = 0; + (surface)->getChromaKey(red, green, blue); + uniforms.chromaKey[0] = (float)red / 255.0f; + uniforms.chromaKey[1] = (float)green / 255.0f; + uniforms.chromaKey[2] = (float)blue / 255.0f; + } //We only know about specific Shaders, only do this if we start with the defaultShader if (shader == m_defaultShader && uniforms.opacity == 1.0f) @@ -440,6 +471,7 @@ bool GLESGraphicsystem::initOpenGLES(EGLint displayWidth, EGLint displayHeight) ShaderProgramFactory::setCreatorFunc(m_shaderCreatorFunc); m_defaultShader = Shader::createShader("default", "default"); m_defaultShaderNoUniformAlpha = Shader::createShader("default", "default_no_uniform_alpha"); + m_defaultShaderAddUniformChromaKey= Shader::createShader("default", "default_add_uniform_chromakey"); #ifdef DRAW_LAYER_DEBUG std::string pluginLookupPath = getenv("LM_PLUGIN_PATH"); @@ -457,7 +489,7 @@ bool GLESGraphicsystem::initOpenGLES(EGLint displayWidth, EGLint displayHeight) m_layerShader = Shader::createShader(vertexShaderPath, fragmentShaderPath); #endif if ( - !m_defaultShader || !m_defaultShaderNoUniformAlpha + !m_defaultShader || !m_defaultShaderNoUniformAlpha || !m_defaultShaderAddUniformChromaKey #ifdef DRAW_LAYER_DEBUG || !m_layerShader #endif diff --git a/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/CMakeLists.txt b/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/CMakeLists.txt index d0b19be..d2848c2 100644 --- a/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/CMakeLists.txt +++ b/LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/CMakeLists.txt @@ -57,6 +57,7 @@ add_dependencies(WaylandGLESRenderer LayerManagerGraphicWaylandGLESv2) install (TARGETS WaylandGLESRenderer DESTINATION lib/layermanager/renderer) install (FILES ../X11GLESRenderer/renderer_frag.glslf DESTINATION lib/layermanager/renderer) install (FILES ../X11GLESRenderer/renderer_frag_no_ualpha.glslf DESTINATION lib/layermanager/renderer) +install (FILES ../X11GLESRenderer/renderer_frag_add_uchromakey.glslf DESTINATION lib/layermanager/renderer) install (FILES ../X11GLESRenderer/renderer_layer.glslf DESTINATION lib/layermanager/renderer) install (FILES ../X11GLESRenderer/renderer_layer.glslv DESTINATION lib/layermanager/renderer) install (FILES ../X11GLESRenderer/renderer_vert.glslv DESTINATION lib/layermanager/renderer) diff --git a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/CMakeLists.txt b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/CMakeLists.txt index ee8fccf..b33752f 100644 --- a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/CMakeLists.txt +++ b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/CMakeLists.txt @@ -1,6 +1,7 @@ ############################################################################ # # Copyright 2010-2012 BMW Car IT GmbH +# Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh # # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -53,6 +54,7 @@ add_dependencies(X11GLESRenderer LayerManagerGraphicGLESv2) install (TARGETS X11GLESRenderer DESTINATION lib/layermanager/renderer) install (FILES renderer_frag.glslf DESTINATION lib/layermanager/renderer) install (FILES renderer_frag_no_ualpha.glslf DESTINATION lib/layermanager/renderer) +install (FILES renderer_frag_add_uchromakey.glslf DESTINATION lib/layermanager/renderer) install (FILES renderer_layer.glslf DESTINATION lib/layermanager/renderer) install (FILES renderer_layer.glslv DESTINATION lib/layermanager/renderer) install (FILES renderer_vert.glslv DESTINATION lib/layermanager/renderer) diff --git a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/renderer_frag_add_uchromakey.glslf b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/renderer_frag_add_uchromakey.glslf new file mode 100644 index 0000000..95174ab --- /dev/null +++ b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/renderer_frag_add_uchromakey.glslf @@ -0,0 +1,40 @@ +/*************************************************************************** +* +* Copyright 2010,2011 BMW Car IT GmbH +* Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************/ +// alpha value of the surfaces +uniform mediump float uAlphaVal; +// textureunit which is accessed +uniform mediump sampler2D uTexUnit; +// chromakey of the surfaces +uniform mediump vec3 uChromaKey; + +// texture coordinates sended by the vertex shader +varying mediump vec2 vTexout; + +void main() +{ + // correct Texture Coords; + mediump vec4 tcolor = texture2D(uTexUnit, vTexout ); + // if both match, discarding + if (tcolor.rgb == uChromaKey.rgb) + { + discard; + } + mediump vec4 color = tcolor * vec4(1.0,1.0,1.0,uAlphaVal); + gl_FragColor = color; +} diff --git a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/ShaderProgramGLES.cpp b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/ShaderProgramGLES.cpp index 57322fb..d942618 100644 --- a/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/ShaderProgramGLES.cpp +++ b/LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/ShaderProgramGLES.cpp @@ -1,6 +1,7 @@ /*************************************************************************** * * Copyright 2010 BMW Car IT GmbH +* Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh * * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -57,7 +58,16 @@ ShaderProgram* ShaderProgramGLES::createProgram(const std::string& vertName, con strcpy(fragmentShaderLocation,defaultShaderDir); strcat(vertexShaderLocation,"/renderer_vert.glslv"); strcat(fragmentShaderLocation,"/renderer_frag_no_ualpha.glslf"); - progHandle = RenderUtilLoadShaderSources(vertexShaderLocation,fragmentShaderLocation, GL_TRUE); } + progHandle = RenderUtilLoadShaderSources(vertexShaderLocation,fragmentShaderLocation, GL_TRUE); + } + else if (vertName=="default" && fragName=="default_add_uniform_chromakey") + { + strcpy(vertexShaderLocation,defaultShaderDir); + strcpy(fragmentShaderLocation,defaultShaderDir); + strcat(vertexShaderLocation,"/renderer_vert.glslv"); + strcat(fragmentShaderLocation,"/renderer_frag_add_uchromakey.glslf"); + progHandle = RenderUtilLoadShaderSources(vertexShaderLocation,fragmentShaderLocation, GL_TRUE); + } else { // load shader sources from file, compile and link them: diff --git a/LayerManagerService/include/ShaderProgram.h b/LayerManagerService/include/ShaderProgram.h index e4653ff..bf6a912 100644 --- a/LayerManagerService/include/ShaderProgram.h +++ b/LayerManagerService/include/ShaderProgram.h @@ -1,6 +1,7 @@ /*************************************************************************** * * Copyright 2010,2011 BMW Car IT GmbH +* Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh * * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -53,6 +54,8 @@ public: float texOffset[2]; int texUnit; float* matrix; + float chromaKey[3]; + bool chromaKeyEnabled; }; /** @@ -163,6 +166,7 @@ private: int m_texOffsetLoc; int m_texUnitLoc; int m_matrixLoc; + int m_chromaKeyLoc; /// global list of programs static ShaderProgramList m_programList; }; diff --git a/LayerManagerService/src/shader/ShaderProgram.cpp b/LayerManagerService/src/shader/ShaderProgram.cpp index 6cf85d4..4c7e152 100644 --- a/LayerManagerService/src/shader/ShaderProgram.cpp +++ b/LayerManagerService/src/shader/ShaderProgram.cpp @@ -1,6 +1,7 @@ /*************************************************************************** * * Copyright 2010,2011 BMW Car IT GmbH + * Copyright (C) 2012 DENSO CORPORATION and Robert Bosch Car Multimedia Gmbh * * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -85,6 +86,7 @@ ShaderProgram::ShaderProgram(const string& vertFileName, const string& fragFileN , m_texOffsetLoc(0) , m_texUnitLoc(0) , m_matrixLoc(0) +, m_chromaKeyLoc(0) { // void } @@ -150,6 +152,10 @@ void ShaderProgram::loadCommonUniforms(const CommonUniforms& uniforms) const { uniformMatrix4fv(m_matrixLoc, 1, false, uniforms.matrix); } + if (m_chromaKeyLoc>= 0) + { + uniform3fv(m_chromaKeyLoc, 1, uniforms.chromaKey); + } } void ShaderProgram::updateCommonUniformLocations(void) @@ -164,5 +170,6 @@ void ShaderProgram::updateCommonUniformLocations(void) m_texOffsetLoc = getUniformLocation("uTexOffset"); m_texUnitLoc = getUniformLocation("uTexUnit"); m_matrixLoc = getUniformLocation("uMatrix"); + m_chromaKeyLoc = getUniformLocation("uChromaKey"); } |