From ddeea3043d479e7c71f8f886bd0109920bc3003e Mon Sep 17 00:00:00 2001 From: weigao Date: Wed, 28 May 2014 12:39:17 +0800 Subject: [PATCH] add batch render shader Change-Id: I44cd54b35f872365268db3b4455beeac01ba3197 --- chart2/Package_opengl.mk | 2 + chart2/opengl/shape3DFragmentShaderBatch.glsl | 108 ++++++++++++++++++ chart2/opengl/shape3DVertexShaderBatch.glsl | 34 ++++++ 3 files changed, 144 insertions(+) create mode 100644 chart2/opengl/shape3DFragmentShaderBatch.glsl create mode 100644 chart2/opengl/shape3DVertexShaderBatch.glsl diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk index 99cdde345756..d8f9fa72ef7c 100644 --- a/chart2/Package_opengl.mk +++ b/chart2/Package_opengl.mk @@ -28,6 +28,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg shape3DVertexShader.glsl \ renderTextureVertexShader.glsl \ renderTextureFragmentShader.glsl \ + shape3DFragmentShaderBatch.glsl \ + shape3DVertexShaderBatch.glsl \ )) # vim: set noet sw=4 ts=4: diff --git a/chart2/opengl/shape3DFragmentShaderBatch.glsl b/chart2/opengl/shape3DFragmentShaderBatch.glsl new file mode 100644 index 000000000000..b7bdc7e025b5 --- /dev/null +++ b/chart2/opengl/shape3DFragmentShaderBatch.glsl @@ -0,0 +1,108 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#version 330 core +#define MAX_LIGHT_NUM 8 + +in vec3 positionWorldspace; +in vec3 normalCameraspace; +in vec4 fragBarColor; +uniform mat4 V; +out vec4 actualColor; +struct MaterialParameters +{ + vec4 ambient; + vec4 diffuse; + vec4 specular; + vec4 materialColor; + + int twoSidesLighting; + float shininess; + float pad; + float pad1; +}; + +layout(std140) uniform GlobalMaterialParameters +{ + MaterialParameters matralParameter; +}Material; + +struct LightSource +{ + vec4 lightColor; + vec4 positionWorldspace; + float lightPower; + float pad1; + float pad2; + float pad3; +}; + +layout(std140) uniform GlobalLights +{ + int lightNum; + vec4 ambient; + LightSource light[MAX_LIGHT_NUM]; +} Lights; + +void main() +{ + vec3 colorTotal = vec3(0.0f, 0.0f, 0.0f); + + vec3 vertexPositionCameraspace = (V * vec4(positionWorldspace,1)).xyz; + + vec3 MaterialDiffuseColor = fragBarColor.rgb; + + vec3 normalDirectionCameraspace = normalCameraspace; + vec3 eyeDirectionCameraspace = normalize(vec3(0, 0, 0) - vertexPositionCameraspace); + float attenuation = 1.0; + int i = 0; + vec3 lightDirectionCameraspace; + vec3 vertexToLightSource; + + vec3 lightAmbient = Lights.ambient.rgb * + MaterialDiffuseColor * + Material.matralParameter.ambient.rgb + * 5.0; + + for (i = 0; i < Lights.lightNum; i++) + { + float LightPower = Lights.light[i].lightPower; + lightDirectionCameraspace = normalize((V * Lights.light[i].positionWorldspace).xyz); + + float cosTheta = clamp(dot(normalDirectionCameraspace,lightDirectionCameraspace), 0,1); + vec3 lightDiffuse = LightPower * + attenuation * + Lights.light[i].lightColor.rgb * + MaterialDiffuseColor * + Material.matralParameter.diffuse.rgb * + cosTheta; + + vec3 specularReflection; + if (dot(normalDirectionCameraspace, lightDirectionCameraspace) < 0) + { + specularReflection = vec3(0.0, 0.0, 0.0); + } + else + { + vec3 R = reflect(-lightDirectionCameraspace,normalDirectionCameraspace); + float cosAlpha = clamp(dot(eyeDirectionCameraspace, R), 0,1); + specularReflection = attenuation * + LightPower * + Lights.light[i].lightColor.rgb * + Material.matralParameter.specular.rgb * + MaterialDiffuseColor * + pow(max(0.0, cosAlpha), Material.matralParameter.shininess); + } + colorTotal += lightDiffuse + specularReflection; + + } + colorTotal += lightAmbient; + actualColor = vec4(colorTotal, 1.0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/opengl/shape3DVertexShaderBatch.glsl b/chart2/opengl/shape3DVertexShaderBatch.glsl new file mode 100644 index 000000000000..8c27c7a9f0a3 --- /dev/null +++ b/chart2/opengl/shape3DVertexShaderBatch.glsl @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#version 330 core +in vec3 vertexPositionModelspace; +in vec3 vertexNormalModelspace; +in mat4 M; +in mat3 normalMatrix; +in vec4 barColor; + +out vec3 positionWorldspace; +out vec3 normalCameraspace; +out vec4 fragBarColor; + +uniform mat4 P; +uniform mat4 V; + +void main() +{ + gl_Position = P * V * M * vec4(vertexPositionModelspace,1); + + positionWorldspace = (M * vec4(vertexPositionModelspace,1)).xyz; + + normalCameraspace = normalize(mat3(V) * normalMatrix * vertexNormalModelspace); + + fragBarColor = barColor; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */