diff options
author | Porteries Tristan <republicthunderbolt9@gmail.com> | 2015-07-03 20:03:29 +0300 |
---|---|---|
committer | Porteries Tristan <republicthunderbolt9@gmail.com> | 2015-07-03 20:03:29 +0300 |
commit | 749f346ce077f9616a47c03cac03f8537274efc4 (patch) | |
tree | 66ac85361c56bcd0deea3a5d61472222223e882c /source | |
parent | c503d1735351a74c43a3ae26c7ff774e940f2a26 (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.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_draw.c | 11 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_material_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_material.c | 2 |
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} }; |