diff options
author | xukai <xukai@multicorewareinc.com> | 2014-05-04 17:05:05 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-05 17:57:18 +0200 |
commit | 8af5e1a9fbd48d173bd1cd98f153428234638707 (patch) | |
tree | 1bb9d5bf6e45f464b120395cc830e2bab27a5745 /chart2 | |
parent | fc4000a9be34304790219f08adfa924801f736e1 (diff) |
add vertex shader and fragment shader for 3D rendering
Change-Id: I7b1ca054006500d468da73d2d85eafaad85dda67
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/Package_opengl.mk | 2 | ||||
-rw-r--r-- | chart2/opengl/shape3DFragmentShader.glsl | 110 | ||||
-rw-r--r-- | chart2/opengl/shape3DVertexShader.glsl | 29 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 1 |
4 files changed, 142 insertions, 0 deletions
diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk index ef33ebbbff44..626a50f5cccb 100644 --- a/chart2/Package_opengl.mk +++ b/chart2/Package_opengl.mk @@ -20,6 +20,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg symbolVertexShader.glsl \ textFragmentShader.glsl \ textVertexShader.glsl \ + shape3DFragmentShader.glsl \ + shape3DVertexShader.glsl \ )) # vim: set noet sw=4 ts=4: diff --git a/chart2/opengl/shape3DFragmentShader.glsl b/chart2/opengl/shape3DFragmentShader.glsl new file mode 100644 index 000000000000..f527dd1da689 --- /dev/null +++ b/chart2/opengl/shape3DFragmentShader.glsl @@ -0,0 +1,110 @@ +/* -*- 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; +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 = Material.matralParameter.materialColor.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; + + if ((Material.matralParameter.twoSidesLighting == 1) && (!gl_FrontFacing)) + { + normalDirectionCameraspace = -normalDirectionCameraspace; + } + 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: */
\ No newline at end of file diff --git a/chart2/opengl/shape3DVertexShader.glsl b/chart2/opengl/shape3DVertexShader.glsl new file mode 100644 index 000000000000..4587feb780da --- /dev/null +++ b/chart2/opengl/shape3DVertexShader.glsl @@ -0,0 +1,29 @@ +/* -*- 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; + +out vec3 positionWorldspace; +out vec3 normalCameraspace; + +uniform mat4 P; +uniform mat4 M; +uniform mat4 V; +uniform mat3 normalMatrix; + +void main() +{ + gl_Position = P * V * M * vec4(vertexPositionModelspace,1); + + positionWorldspace = (M * vec4(vertexPositionModelspace,1)).xyz; + + normalCameraspace = normalize(mat3(V) * normalMatrix * vertexNormalModelspace); +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index b9776545ef65..0b210cbb320f 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -140,6 +140,7 @@ void OpenGL3DRenderer::init() m_3DProjection = glm::perspective(30.0f, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f); + LoadShaders(); } void OpenGL3DRenderer::AddVertexData(GLuint vertexBuf) |