Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
C-Fu
OpenGL
Commits
a521dfc2
Commit
a521dfc2
authored
Jan 17, 2017
by
Anakin
Browse files
calculate normal matrix once in cpp (performance),
added bool variable to turn light on/off (still needs button),
parent
f5863752
Changes
4
Hide whitespace changes
Inline
Side-by-side
QtMeshViewer/Header/OglViewerWidget.h
View file @
a521dfc2
...
...
@@ -38,7 +38,7 @@ private:
}
m_rotDirections
;
struct
{
QVector3D
position
=
{
1
,
1
,
1
};
QVector3D
position
=
{
1
0
,
1
0
,
1
0
};
QVector3D
intensities
=
{
1
,
0.25
,
0.25
};
}
m_light
;
...
...
@@ -50,6 +50,7 @@ private:
QQuaternion
m_rotation
;
bool
m_wireframe
=
false
;
bool
m_lightOn
=
true
;
protected:
void
mousePressEvent
(
QMouseEvent
*
e
)
Q_DECL_OVERRIDE
;
...
...
QtMeshViewer/Resources/fshader.glsl
View file @
a521dfc2
...
...
@@ -4,10 +4,8 @@ precision mediump int;
precision
mediump
float
;
#endif
//
uniform mat3 n_matrix;
uniform
mat3
n_matrix
;
uniform
sampler2D
texture
;
uniform
mat4
norm_matrix
;
uniform
mat4
m_matrix
;
uniform
struct
Light
{
vec3
position
;
...
...
@@ -15,6 +13,7 @@ uniform struct Light {
}
light
;
uniform
bool
b_transparent
;
uniform
bool
b_light
;
varying
vec2
v_texcoord
;
varying
vec3
v_position
;
...
...
@@ -22,21 +21,34 @@ varying vec3 v_normal;
void
main
()
{
mat3
n_matrix
=
transpose
(
inverse
(
mat3
(
norm_matrix
*
m_matrix
)));
vec3
normal
=
normalize
(
n_matrix
*
v_normal
)
;
// variables
float
brightness
;
vec3
surfaceToLight
=
light
.
position
-
v_position
;
if
(
b_light
==
true
)
{
// calculate normals in worldspace
vec3
normal
=
normalize
(
n_matrix
*
v_normal
);
float
brightness
=
dot
(
normal
,
surfaceToLight
)
/
(
length
(
surfaceToLight
)
*
length
(
normal
));
brightness
=
clamp
(
brightness
,
0
,
1
)
;
//get the surface - light vector (cause this is a candel)
vec3
surfaceToLight
=
light
.
position
-
v_position
;
// Set fragment color from texture
// calculate the brightness depending on the angle
brightness
=
dot
(
normal
,
surfaceToLight
)
/
(
length
(
surfaceToLight
)
*
length
(
normal
));
brightness
=
clamp
(
brightness
,
0
,
1
);
}
else
{
brightness
=
1
;
light
.
intensities
=
vec3
(
1
,
1
,
1
);
}
// get fragment color from texture
vec4
surfaceColor
=
vec4
(
texture2D
(
texture
,
v_texcoord
));
// if not transparent, ignore alpha value and set it to 1
if
(
!
b_transparent
)
{
surfaceColor
.
a
=
1
.
0
f
;
}
// pass the data to ogl
gl_FragColor
=
vec4
(
brightness
*
light
.
intensities
*
surfaceColor
.
rgb
,
surfaceColor
.
a
);
}
QtMeshViewer/Source/GeometryEngine.cpp
View file @
a521dfc2
...
...
@@ -191,6 +191,9 @@ void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe)
// Set model matrix
program
->
setUniformValue
(
"m_matrix"
,
it
.
modelMatrix
);
// Set normal matrix
program
->
setUniformValue
(
"n_matrix"
,
(
normMatrix
*
it
.
modelMatrix
).
normalMatrix
());
// decide if this is transparent
program
->
setUniformValue
(
"b_transparent"
,
tmp_transparent
);
...
...
QtMeshViewer/Source/OglViewerWidget.cpp
View file @
a521dfc2
...
...
@@ -226,7 +226,8 @@ void OglViewerWidget::paintGL()
// Set view-projection matrix
m_program
.
setUniformValue
(
"vp_matrix"
,
m_projection
*
view
);
// Set Light
// Set Light values
m_program
.
setUniformValue
(
"b_light"
,
m_lightOn
);
m_program
.
setUniformValue
(
"light.position"
,
m_light
.
position
);
m_program
.
setUniformValue
(
"light.intensities"
,
m_light
.
intensities
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment