summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuhiko Tanibata <ntanibata@jp.adit-jv.com>2012-07-26 09:20:47 +0900
committerMichael Schuldt <michael.schuldt@bmw.de>2012-09-12 11:34:00 +0200
commit6724d78f8c2974b57b88a0e262788c5624275b38 (patch)
treeaca292487c548da889f79280366e8052de3eecc8
parent7f6993127fbbcc455dc4b9521d691e326a596466 (diff)
downloadlayer_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.
-rw-r--r--LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/GLESGraphicSystem.h2
-rw-r--r--LayerManagerPlugins/Renderers/Graphic/src/GraphicSystems/GLESGraphicSystem.cpp46
-rw-r--r--LayerManagerPlugins/Renderers/Platform/WaylandGLESRenderer/CMakeLists.txt1
-rw-r--r--LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/CMakeLists.txt2
-rw-r--r--LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/renderer_frag_add_uchromakey.glslf40
-rw-r--r--LayerManagerPlugins/Renderers/Platform/X11GLESRenderer/src/ShaderProgramGLES.cpp12
-rw-r--r--LayerManagerService/include/ShaderProgram.h4
-rw-r--r--LayerManagerService/src/shader/ShaderProgram.cpp7
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");
}