[Bf-blender-cvs] [749f346] master: BGE: Add alpha to coverage render mode.

Porteries Tristan noreply at git.blender.org
Fri Jul 3 19:03:40 CEST 2015


Commit: 749f346ce077f9616a47c03cac03f8537274efc4
Author: Porteries Tristan
Date:   Fri Jul 3 19:03:29 2015 +0200
Branches: master
https://developer.blender.org/rB749f346ce077f9616a47c03cac03f8537274efc4

BGE: Add alpha to coverage render mode.

This patch add a new option for transparency meshes : Alpha to coverage, in the game setting panel in material.
The alpha to coverage request a multisample, the best is 8x but 4x and 2x can also give nice render.

4x alpha clip : http://www.pasteall.org/pic/show.php?id=89464
4x alpha to coverage : http://www.pasteall.org/pic/show.php?id=89463

Reviewers: moguri, kupoman, campbellbarton, psy-fi

Reviewed By: psy-fi

Subscribers: lordloki, rdb

Projects: #game_engine

Differential Revision: https://developer.blender.org/D1354

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

M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_draw.c
M	source/blender/makesdna/DNA_material_types.h
M	source/blender/makesrna/intern/rna_material.c

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

diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index ee6e025..b8a7fca 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -108,7 +108,8 @@ typedef enum GPUBlendMode {
 	GPU_BLEND_ADD = 1,
 	GPU_BLEND_ALPHA = 2,
 	GPU_BLEND_CLIP = 4,
-	GPU_BLEND_ALPHA_SORT = 8
+	GPU_BLEND_ALPHA_SORT = 8,
+	GPU_BLEND_ALPHA_TO_COVERAGE = 16
 } GPUBlendMode;
 
 typedef struct GPUNodeStack {
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index a24067f..2186f20 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -409,15 +409,18 @@ static void gpu_set_alpha_blend(GPUBlendMode alphablend)
 	if (alphablend == GPU_BLEND_SOLID) {
 		glDisable(GL_BLEND);
 		glDisable(GL_ALPHA_TEST);
+		glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
 		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	}
 	else if (alphablend == GPU_BLEND_ADD) {
 		glEnable(GL_BLEND);
 		glBlendFunc(GL_ONE, GL_ONE);
 		glDisable(GL_ALPHA_TEST);
+		glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
 	}
 	else if (ELEM(alphablend, GPU_BLEND_ALPHA, GPU_BLEND_ALPHA_SORT)) {
 		glEnable(GL_BLEND);
+		glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
 
 		/* for OpenGL render we use the alpha channel, this makes alpha blend correct */
 		if (GLEW_VERSION_1_4)
@@ -438,10 +441,16 @@ static void gpu_set_alpha_blend(GPUBlendMode alphablend)
 		}
 	}
 	else if (alphablend == GPU_BLEND_CLIP) {
-		glDisable(GL_BLEND); 
+		glDisable(GL_BLEND);
+		glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
 		glEnable(GL_ALPHA_TEST);
 		glAlphaFunc(GL_GREATER, 0.5f);
 	}
+	else if (alphablend == GPU_BLEND_ALPHA_TO_COVERAGE) {
+		glEnable(GL_ALPHA_TEST);
+		glAlphaFunc(GL_GREATER, U.glalphaclip);
+		glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
+	}
 }
 
 static void gpu_verify_alpha_blend(int alphablend)
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index c327043..8790f73 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -210,6 +210,7 @@ typedef struct Material {
 #define	GEMAT_ALPHA		2 /* GPU_BLEND_ALPHA */
 #define GEMAT_CLIP		4 /* GPU_BLEND_CLIP */
 #define	GEMAT_ALPHA_SORT	8 /* GPU_BLEND_ALPHA_SORT */
+#define	GEMAT_ALPHA_TO_COVERAGE	16 /* GPU_BLEND_ALPHA_TO_COVERAGE */
 
 // Game Options - flag
 #define GEMAT_BACKCULL 		16 /* KX_BACKCULL */
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 874e861..38ff701 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -837,6 +837,8 @@ static void rna_def_material_gamesettings(BlenderRNA *brna)
 		              "Render polygon transparent, depending on alpha channel of the texture"},
 		{GEMAT_ALPHA_SORT, "ALPHA_SORT", 0, "Alpha Sort",
 		                   "Sort faces for correct alpha drawing (slow, use Alpha Clip instead when possible)"},
+		{GEMAT_ALPHA_TO_COVERAGE, "ALPHA_TO_COVERAGE", 0, "Alpha Antialiasing",
+				"Use textures alpha as anti-aliasing mask, requires multi-sample OpenGL display"},
 		{0, NULL, 0, NULL, NULL}
 	};




More information about the Bf-blender-cvs mailing list