User Tools

Site Tools


base:backface_culling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:backface_culling [2015-04-17 04:30] (current)
Line 1: Line 1:
 +====  Backface Culling ====
  
 +by Bitbreaker/​Oxyron/​Nuance
 +
 +An easy way to find out if a face faces towards the viewer or away is to check whether the area covered by a face is positive (frontface) or negative (backface).
 +This done by taking the first 3 vertices (already transformed into 2D) of that face and calculating the following:
 +
 +(v1.y - v0.y) * (v2.x - v1.x) - (v1.x - v0.x) * (v2.y - v1.y)
 +
 +If the result is positive, the face is visible and rendered, else it is discarded.
 +
 +<​code>​
 +         ;​calculate the signed area while copying the vertices into the vertexbuffer for drawing
 +         ldx faces+0,y
 +         lda vertices_x,​x
 +         sta verticebuf_x+0
 +         lda vertices_y,​x
 +         sta verticebuf_y+0
 +
 +         ldx faces+1,y
 +         lda vertices_x,​x
 +         sta verticebuf_x+1
 +         sec
 +         sbc verticebuf_x+0
 +
 +         ;set up first factor
 +         sta z1_+1
 +         eor #$ff
 +         sta z2_+1
 +
 +         lda vertices_y,​x
 +         sta verticebuf_y+1
 +         sec
 +         sbc verticebuf_y+0
 +
 +         ;set up second factor
 +         sta z3_+1
 +         eor #$ff
 +         sta z4_+1
 +
 +         ldx faces+2,y
 +         lda vertices_x,​x
 +         sta verticebuf_x+2
 +         sec
 +         sbc verticebuf_x+1
 +
 +         ;​multiplier 1
 +         tay
 +         
 +         lda vertices_y,​x
 +         sta verticebuf_y+2
 +         sec
 +         sbc verticebuf_y+1
 +
 +         ;​multiplier 2
 +         tax
 +
 +z3_      lda tmath1,y
 +         sec
 +z4_      sbc tmath2,y
 +         sec
 +z1_      sbc tmath1,x
 +         clc
 +z2_      adc tmath2,x
 +
 +         ;skip if negative
 +         bmi +
 +         jsr drawface
 ++
 +</​code>​
 +
 +Though things are fast, all this can be a bit unprecise when faces get small, so it is smart to let the filler test if x1 > x2 when drawing a line of a face and thus stopping filling if this happens, else you might end up in slight glitches.
 +
 +====  Backface Culling - Alot faster method ====
 +
 +by JackAsser / Booze Design
 +
 +Please see the attached PDF. {{:​base:​rotation_and_backface_culling_for_simple_demo.pdf|}}
base/backface_culling.txt ยท Last modified: 2015-04-17 04:30 (external edit)