diff options
author | rodri <rgl@antares-labs.eu> | 2023-11-11 16:45:36 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2023-11-11 16:45:36 +0000 |
commit | 97755fa8d53ac6595df5cd7c8271cd823f1a431a (patch) | |
tree | 82785ea5c1b41b7abb3d8b450d5c874703e5cab5 | |
parent | 95630e7edcfc1a3f7e89444c7cc61554f6422626 (diff) | |
download | tinyrend-97755fa8d53ac6595df5cd7c8271cd823f1a431a.tar.gz tinyrend-97755fa8d53ac6595df5cd7c8271cd823f1a431a.tar.bz2 tinyrend-97755fa8d53ac6595df5cd7c8271cd823f1a431a.zip |
Lesson 1: Triangle rasterization and back-face culling—Flat shading render
-rw-r--r-- | main.c | 32 |
1 files changed, 25 insertions, 7 deletions
@@ -346,6 +346,9 @@ modelshader(Sparams *sp) Point3 bc; int i; uchar cbuf[4]; + static Point3 light = {0,0,-1,1}; /* global point light */ + Point3 n; + double intensity; verts = model->vertdata[OBJVGeometric].verts; @@ -370,10 +373,16 @@ modelshader(Sparams *sp) if(bc.x < 0 || bc.y < 0 || bc.z < 0) continue; + n = normvec3(crossvec3(subpt3(t.p2, t.p0), subpt3(t.p1, t.p0))); + intensity = dotvec3(n, light); + /* back-face culling */ + if(intensity < 0) + continue; + cbuf[0] = 0xFF; - cbuf[1] = 0xFF*bc.x; - cbuf[2] = 0xFF*bc.y; - cbuf[3] = 0xFF*bc.z; + cbuf[1] = 0xFF*intensity; + cbuf[2] = 0xFF*intensity; + cbuf[3] = 0xFF*intensity; memfillcolor(sp->frag, *(ulong*)cbuf); return sp->frag; @@ -392,6 +401,9 @@ drawmodel(Memimage *dst) Triangle st; int i; uchar cbuf[4]; + static Point3 light = {0,0,-1,1}; /* global point light */ + Point3 n; + double intensity; verts = model->vertdata[OBJVGeometric].verts; @@ -416,10 +428,16 @@ drawmodel(Memimage *dst) if(eqpt(st[0], st[1]) || eqpt(st[1], st[2]) || eqpt(st[2], st[0])) continue; + n = normvec3(crossvec3(subpt3(t.p2, t.p0), subpt3(t.p1, t.p0))); + intensity = dotvec3(n, light); + /* back-face culling */ + if(intensity < 0) + continue; + cbuf[0] = 0xFF; - cbuf[1] = 0xFF*frand(); - cbuf[2] = 0xFF*frand(); - cbuf[3] = 0xFF*frand(); + cbuf[1] = 0xFF*intensity; + cbuf[2] = 0xFF*intensity; + cbuf[3] = 0xFF*intensity; filltriangle(dst, st[0], st[1], st[2], rgb(*(ulong*)cbuf)); } @@ -537,7 +555,7 @@ threadmain(int argc, char *argv[]) if(newwindow(nil) < 0) sysfatal("newwindow: %r"); - if(initdraw(nil, nil, nil) < 0) + if(initdraw(nil, nil, "tinyrend") < 0) sysfatal("initdraw: %r"); if(memimageinit() != 0) sysfatal("memimageinit: %r"); |