Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-01-18 18:29:52 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-01-18 18:30:05 +0300
commitb5bc2158a07140e5463e209839bcf36d2ce2cddc (patch)
tree31e0ee0d88ff92ac00b65b8dbc255c9c7a46c751 /source/blender/draw/modes/shaders/object_grid_vert.glsl
parentbb4c760fddf8bdd09cb387ad5421ca026eff8378 (diff)
View 3D Grid: Improve precision and reduce code complexity
Instead of doing manual ray-plane intersection we use normalized positions of the grid mesh and apply scaling after interpolation so that we keep good precision even at really far distances. Precision is now two order of magnitude better and does not produce the same kind of artifact at lower clip start values. This commit also cleanup the implementation. Fixes T58918 Grid not appearing correctly at low clip start in 2.8
Diffstat (limited to 'source/blender/draw/modes/shaders/object_grid_vert.glsl')
-rw-r--r--source/blender/draw/modes/shaders/object_grid_vert.glsl28
1 files changed, 12 insertions, 16 deletions
diff --git a/source/blender/draw/modes/shaders/object_grid_vert.glsl b/source/blender/draw/modes/shaders/object_grid_vert.glsl
index 15b37bb289d..1cf6c49b733 100644
--- a/source/blender/draw/modes/shaders/object_grid_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_vert.glsl
@@ -5,7 +5,9 @@
uniform mat4 ViewProjectionMatrix;
uniform mat4 ProjectionMatrix;
uniform vec3 cameraPos;
+uniform vec3 planeAxes;
uniform vec4 gridSettings;
+uniform float meshSize;
#define gridDistance gridSettings.x
#define gridResolution gridSettings.y
@@ -22,42 +24,36 @@ uniform int gridFlag;
in vec3 pos;
+out vec3 local_pos;
+
void main()
{
- vec3 vert_pos, proj_camera_pos;
+ vec3 vert_pos;
/* Project camera pos to the needed plane */
if ((gridFlag & PLANE_XY) != 0) {
vert_pos = vec3(pos.x, pos.y, 0.0);
- proj_camera_pos = vec3(cameraPos.x, cameraPos.y, 0.0);
}
else if ((gridFlag & PLANE_XZ) != 0) {
vert_pos = vec3(pos.x, 0.0, pos.y);
- proj_camera_pos = vec3(cameraPos.x, 0.0, cameraPos.z);
}
else {
vert_pos = vec3(0.0, pos.x, pos.y);
- proj_camera_pos = vec3(0.0, cameraPos.y, cameraPos.z);
}
- /* if persp */
- if (ProjectionMatrix[3][3] == 0.0) {
- vert_pos *= gridDistance * 2.0;
- }
- else {
- float viewdist = 1.0 / min(abs(ProjectionMatrix[0][0]), abs(ProjectionMatrix[1][1]));
- vert_pos *= viewdist * gridDistance * 2.0;
- }
+ local_pos = vert_pos;
- vec3 realPos = proj_camera_pos + vert_pos;
+ vec3 real_pos = cameraPos * planeAxes + vert_pos * meshSize;
/* Used for additional Z axis */
if ((gridFlag & CLIP_Z_POS) != 0) {
- realPos.z = clamp(realPos.z, 0.0, 1e30);
+ real_pos.z = clamp(real_pos.z, 0.0, 1e30);
+ local_pos.z = clamp(local_pos.z, 0.0, 1.0);
}
if ((gridFlag & CLIP_Z_NEG) != 0) {
- realPos.z = clamp(realPos.z, -1e30, 0.0);
+ real_pos.z = clamp(real_pos.z, -1e30, 0.0);
+ local_pos.z = clamp(local_pos.z, -1.0, 0.0);
}
- gl_Position = ViewProjectionMatrix * vec4(realPos, 1.0);
+ gl_Position = ViewProjectionMatrix * vec4(real_pos, 1.0);
}