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
path: root/source
diff options
context:
space:
mode:
authorPorteries Tristan <republicthunderbolt9@gmail.com>2015-07-03 20:03:29 +0300
committerPorteries Tristan <republicthunderbolt9@gmail.com>2015-07-03 20:03:29 +0300
commit749f346ce077f9616a47c03cac03f8537274efc4 (patch)
tree66ac85361c56bcd0deea3a5d61472222223e882c /source
parentc503d1735351a74c43a3ae26c7ff774e940f2a26 (diff)
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
Diffstat (limited to 'source')
-rw-r--r--source/blender/gpu/GPU_material.h3
-rw-r--r--source/blender/gpu/intern/gpu_draw.c11
-rw-r--r--source/blender/makesdna/DNA_material_types.h1
-rw-r--r--source/blender/makesrna/intern/rna_material.c2
4 files changed, 15 insertions, 2 deletions
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index ee6e02547e7..b8a7fca1380 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 a24067fc381..2186f20d173 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 c3270430a3a..8790f736600 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 874e861f75f..38ff701510a 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}
};