[Bf-blender-cvs] [cdad75303a5] soc-2018-npr: Fixed line width incorrect variations under different aspect ratios.

Nick Wu noreply at git.blender.org
Thu Sep 6 03:51:05 CEST 2018


Commit: cdad75303a5040cc4152da25010fdd1b313fa065
Author: Nick Wu
Date:   Thu Sep 6 09:48:04 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBcdad75303a5040cc4152da25010fdd1b313fa065

Fixed line width incorrect variations under different aspect ratios.

===================================================================

M	source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_chain_geom.glsl
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_line_chain_geom.glsl
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_passthrough_vert.glsl

===================================================================

diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl b/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
index 9405cad5fa0..5591cc6aa5f 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_dpix_preview_geom.glsl
@@ -69,6 +69,10 @@ void draw_line(vec4 p1, vec4 p2, int is_crease){
 	vec4 a, b, c, d;
 
 	vec4 offset = Normal * use_thickness * 0.001;
+
+	//correct thickness
+	offset.x *= viewport.w/viewport.z;
+
 	a = p1 + offset;
 	b = p1 - offset;
 	c = p2 + offset;
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_software_chain_geom.glsl b/source/blender/draw/engines/lanpr/shaders/lanpr_software_chain_geom.glsl
index 65f9b3bf1c8..3c7945ed834 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_software_chain_geom.glsl
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_software_chain_geom.glsl
@@ -48,6 +48,10 @@ uniform float taper_r_dist;
 uniform float taper_l_strength;
 uniform float taper_r_strength;
 
+// for line width correction
+uniform vec4 output_viewport;
+uniform vec4 preview_viewport;
+
 out vec4 out_color;
 
 float use_thickness;
@@ -96,6 +100,8 @@ void draw_line(vec4 LL, vec4 L, vec4 R, vec4 RR){
 
 	float lim = use_thickness * 0.002;
 
+	float x_scale = preview_viewport.w / preview_viewport.z;
+
 	if (LL.x < 3e20) {
 		vec4 avg = normalize(L - LL) + normalize(R - L);
 		if (length(avg) > 0.001) {
@@ -103,6 +109,7 @@ void draw_line(vec4 LL, vec4 L, vec4 R, vec4 RR){
 			vec4 Minter = normalize(vec4(-Tangent.y, Tangent.x, 0, 0));
 			float length = use_thickness / (dot(Minter, Normal)) * 0.001;
 			if (length < 4 * lim) {
+				Minter.x *= x_scale;
 				a = L - length * Minter;
 				b = L + length * Minter;
 			}
@@ -116,6 +123,7 @@ void draw_line(vec4 LL, vec4 L, vec4 R, vec4 RR){
 			vec4 Minter = normalize(vec4(-Tangent.y, Tangent.x, 0, 0));
 			float length = use_thickness / (dot(Minter, Normal)) * 0.001;
 			if (length < 4 * lim) {
+				Minter.x *= x_scale;
 				c = R - length * Minter;
 				d = R + length * Minter;
 			}
@@ -135,7 +143,7 @@ void draw_line(vec4 LL, vec4 L, vec4 R, vec4 RR){
 	a.w = 1;
 	b.w = 1;
 	c.w = 1;
-	d.w = 1;
+	d.w = 1;	
 
 	gl_Position = a;
 	EmitVertex();
@@ -188,10 +196,19 @@ void main() {
 
 	if (occlusion_level_begin > level || occlusion_level_end < level) return;
 
+	float asp1 = output_viewport.z / output_viewport.w;
+	float asp2 = preview_viewport.z / preview_viewport.w;
+	float x_scale = asp1 / asp2;
+	
 	vec4 LL = vec4(gl_in[0].gl_Position.xy, 0, 1),
 	     L  = vec4(gl_in[1].gl_Position.xy, 0, 1),
 	     R  = vec4(gl_in[2].gl_Position.xy, 0, 1),
 	     RR = vec4(gl_in[3].gl_Position.xy, 0, 1);
+	
+	LL.x *= x_scale;
+	L.x  *= x_scale;
+	R.x  *= x_scale;
+	RR.x *= x_scale;
 
 	int type = gType[1];
 
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_software_line_chain_geom.glsl b/source/blender/draw/engines/lanpr/shaders/lanpr_software_line_chain_geom.glsl
index 38254a7f992..262ab8b271b 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_software_line_chain_geom.glsl
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_software_line_chain_geom.glsl
@@ -30,6 +30,10 @@ uniform vec4 material_color;
 uniform vec4 edge_mark_color;
 uniform vec4 intersection_color;
 
+// for line width correction
+uniform vec4 output_viewport;
+uniform vec4 preview_viewport;
+
 out vec4 out_color;
 
 float use_thickness;
@@ -41,6 +45,8 @@ void draw_line(vec4 p1, vec4 p2){
 
 	vec4 a, b, c, d;
 
+	float x_scale = preview_viewport.w / preview_viewport.z;
+	Normal.x *= x_scale;
 	vec4 offset = Normal * use_thickness * 0.001;
 
 	a = p1 + offset;
@@ -89,9 +95,17 @@ void decide_color_and_thickness(float component_id){
 }
 
 void main() {
+
+	float asp1 = output_viewport.z / output_viewport.w;
+	float asp2 = preview_viewport.z / preview_viewport.w;
+	float x_scale = asp1 / asp2;
+
 	vec4 p1 = vec4(gl_in[0].gl_Position.xy, 0, 1);
 	vec4 p2 = vec4(gl_in[1].gl_Position.xy, 0, 1);
 
+	p1.x *= x_scale;
+	p2.x *= x_scale;
+
 	decide_color_and_thickness(gl_in[0].gl_Position.z);
 
 	draw_line(p1, p2);
diff --git a/source/blender/draw/engines/lanpr/shaders/lanpr_software_passthrough_vert.glsl b/source/blender/draw/engines/lanpr/shaders/lanpr_software_passthrough_vert.glsl
index 49717648a64..b2ca775be80 100644
--- a/source/blender/draw/engines/lanpr/shaders/lanpr_software_passthrough_vert.glsl
+++ b/source/blender/draw/engines/lanpr/shaders/lanpr_software_passthrough_vert.glsl
@@ -14,9 +14,10 @@ out vec3 gNormal;
 
 void main(){
 	vec4 p = pos;
-	float asp1 = output_viewport.z / output_viewport.w;
-	float asp2 = preview_viewport.z / preview_viewport.w;
-	p.x = pos.x / asp2 * asp1;
+	// move to geo shader
+	//float asp1 = output_viewport.z / output_viewport.w;
+	//float asp2 = preview_viewport.z / preview_viewport.w;
+	//p.x = pos.x / asp2 * asp1;
 
 	gOffset = uvs;
 	gType = type;



More information about the Bf-blender-cvs mailing list