diff options
author | chai <chaifix@163.com> | 2020-07-18 02:48:39 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-07-18 02:48:39 +0800 |
commit | e5e995103377f9bb79123ef8257d8680ed0945fc (patch) | |
tree | 1831f3d2242c8173075576816b9032001580d20b /src/core/rasterizer.c | |
parent | 275bf123ff505eef3333ba41385ed3814eb9a507 (diff) |
*late culling
Diffstat (limited to 'src/core/rasterizer.c')
-rw-r--r-- | src/core/rasterizer.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c index 28ae639..c5745ba 100644 --- a/src/core/rasterizer.c +++ b/src/core/rasterizer.c @@ -86,19 +86,31 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, uint IA, uint IB, uint IC, Program* program, - UniformCollection* uniforms + UniformCollection* uniforms, + bool early_culled ) { ssr_assert(CA && CB && CC && program); + /*late back face culling*/ + if (!early_culled && ssr_isenable(ENABLE_BACKFACECULL)) { + float w0 = 1 / CA->w, w1 = 1 / CB->w, w2 = 1 / CC->w; + Vec2 ab, ac; + ab.x = CB->x * w1 - CA->x * w0; + ab.y = CB->y * w1 - CA->y * w0; + ac.x = CC->x * w2 - CA->x * w0; + ac.y = CC->y * w2 - CA->y * w0; + if (ab.x * ac.y - ab.y * ac.x <= 0) { + return; + } + } + Vec4 SA, SB, SC; internal_vec4_dividewnoz(CA, &SA); ssrU_viewport(&SA, &SA); internal_vec4_dividewnoz(CB, &SB); ssrU_viewport(&SB, &SB); internal_vec4_dividewnoz(CC, &SC); ssrU_viewport(&SC, &SC); -/* - puttriangle(&SA, &SB, &SC, 0xffff0000); - return; -*/ + //puttriangle(&SA, &SB, &SC, 0xffff0000); + //return; Vec4 *sa = &SA, *sb = &SB, *sc = &SC, *tmp; Vec4 *v4tmp; |