diff --git a/QtMeshViewer/Header/OglViewerWidget.h b/QtMeshViewer/Header/OglViewerWidget.h index 0fd1cea..b356aee 100644 --- a/QtMeshViewer/Header/OglViewerWidget.h +++ b/QtMeshViewer/Header/OglViewerWidget.h @@ -37,6 +37,11 @@ private: bool z = true; } m_rotDirections; + struct { + QVector3D position = { 1,1,1 }; + QVector3D intensities = { 1,1,1 }; + } m_light; + QOpenGLShaderProgram m_program; GeometryEngine *m_dataEngine; diff --git a/QtMeshViewer/Resources/fshader.glsl b/QtMeshViewer/Resources/fshader.glsl index 1d9163e..68efc1d 100644 --- a/QtMeshViewer/Resources/fshader.glsl +++ b/QtMeshViewer/Resources/fshader.glsl @@ -6,10 +6,11 @@ precision mediump float; uniform mat3 n_matrix; uniform sampler2D texture; +uniform mat4 m_matrix; uniform struct Light { - vec3 position; - vec3 intensities; + vec3 position; + vec3 intensities; } light; uniform bool b_transparent; @@ -20,13 +21,13 @@ varying vec3 v_normal; void main() { - - vec3 normal = normalize(n_matrix * v_normal); + mat3 normalMatrix = transpose(inverse(mat3(m_matrix))); + vec3 normal = normalize(n_matrix * v_normal); - vec3 surfaceToLight = light.position - v_position; - - float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal)); - brightness = clamp(brightness, 0, 1); + vec3 surfaceToLight = light.position - v_position; + + float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal)); + brightness = clamp(brightness, 0, 1); // Set fragment color from texture vec4 surfaceColor = vec4(texture2D(texture, v_texcoord)); diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index 60221ae..da922fd 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -225,6 +225,10 @@ void OglViewerWidget::paintGL() // Set view-projection matrix m_program.setUniformValue("vp_matrix", m_projection * view); + // Set Light + m_program.setUniformValue("light.position", m_light.position); + m_program.setUniformValue("light.intensities", m_light.intensities); + // Draw cube geometry m_dataEngine->drawGeometry(&m_program, m_wireframe); }