Web
Analytics
Log In  

7

Cart [#53994#] | Copy | Code | 2018-07-07 | Link
7

I am still very new to PICO-8 and saw a few games rendered with polygons.
This lead me to the Trifill Thunderdome benchmark by Musurca.

One thing this benchmark didn't show was the number of tokens for each method which is an important detail considering the limitations of the platform.

Also, I wrote two triangle rasterizers in 163 and 335 tokens respectively which perform pretty decently. They might be an acceptable alternative to ElectricGryphon's super fast triangle rasterizer if you need an extra 2-400 tokens. If you don't, by all mean use his. It is the fastest one I found, and by a good margin!

Update 20180706: Added the possibility to switch rasterizer and turn the test triangle with the arrow keys. This allows to compare rasterizers at a normal pace. Updated EG's rasterizer to the latest he posted in the previous thread and added the one from Gryphon 3D Engine Library v2 only modified to use normal color() and fillp().

Update 20180708: Added a fill pattern and a toggle for the results and control wireframe.

Hope this helps,

triangle rasterizer benchmark eletricgryphon musurca catafish nusan creamdog
P#53941 2018-07-04 16:42 ( Edited 2018-07-08 13:39)

::

Looks like some of the new rasterizers have severe artifacts on edges.
@p01 are these yours?

P#53947 2018-07-05 02:59

::

That would be the one by @creamdog. It uses memset(screenAddress, col * 17, scanlineWidth) which can only set an even number of pixels. Hence the half resolution horizontally and the artifacts.

The triangle you see spinning after the benchmark uses my 335 tokens rasterizer.

P#53949 2018-07-05 04:23

::

Nice work! I haven't looked at the code yet, but that's a mighty optimization effort right there. (Twice!)

edit: I added some code to switch between renderers on the result screen, there seems to be something not quite right with at least one of the algorithms. (Pretty sure I set things up right, maybe not?)

z changes the renderer, x pauses the rotation, up changes the colour.
You might want to extend this to modify the vertices as well if you're hunting for artefacts.


add this part after the tests array definition, around line 620

functioninfo={}
add(functioninfo, { tests[1], solid_trifill_v3, "solid_trifill_v3" } )
add(functioninfo, { tests[2], function(...) local v={...} musurca_triangle({v[1],v[2]},{v[3],v[4]},{v[5],v[6]},v[7]) end, "musurca_triangle" } )
add(functioninfo, { tests[3], creamdog_tri, "creamdog_tri" } )
add(functioninfo, { tests[4], p01_triangle_335, "p01_triangle_335" } )
add(functioninfo, { tests[5], function(...) gfx_draw({...}) end, "gfx_draw" } )
add(functioninfo, { tests[6], steptri, "steptri" } )
add(functioninfo, { tests[7], p01_triangle_163, "p01_triangle_163" } )

replace everything from ::loop_showing_results:: onwards with this

local method,col,pausetime,paused=3,0,0,false
::loop_showing_results::
cls(1)

local u=t()/8
if btnp(5) then
 if (not paused) pausetime=u
 paused=not paused
end
if (paused) u=pausetime

if (btnp(2)) col=(col+1)%16
local r=80+32*cos(u*1.7)
if btnp(4)  then
 method=(method+1)%#functioninfo
end
local fn=functioninfo[method+1]
fn[2](64+r*cos(u),64+r*sin(u),64+r*cos(u+.33),64+r*sin(u+.33),64+r*cos(u+.67),64+r*sin(u+.67),col)

--zebra = 0
for i=0,#tests do print_result(i) end
print(fn[1].author.."-"..fn[3],0,122,7)
flip()
goto loop_showing_results

P#53956 2018-07-05 11:44 ( Edited 2018-07-06 22:04)

::

THANKS!

Excellent idea to try the different rasterizers after the benchmark.

I tried this last night and saw some have wild bugs. I updated EG's rasterizer to the last one he posted in the previous thread, and the one from the Gryphon 3D librarry v2 and now my "big" rasterizer comes ahead :U

P#53963 2018-07-06 08:17 ( Edited 2018-07-06 09:48)

::

Another nice addition would be an overlay of the demo triangle using plain lines (dunno, switch on/off using button).
Not all rasterizers are drawing the triangle at the same place!!

EDIT: just did the test, and @P01 are fast and accurate. Nice job!

...
tests[method_index].fn(1)
-- "native" pico triangle/lines
if btn(4) then
 for i=0,2 do
    local p0,p1=2*i+1,(2*(i+1))%6+1
    line(f[p0],f[p0+1],f[p1],f[p1+1],8)
 end
end
P#53968 2018-07-06 13:00 ( Edited 2018-07-06 13:13)

::

Thanks. Great idea. I also added a fill pattern to make sure the different rasterizers can draw shaded triangles.

P#53995 2018-07-07 19:45

Log in to post a comment

user:
password:

New User | Account Help
:: New User
X
About | Contact | Updates | Terms of Use
Follow Lexaloffle:        
Generated 2018-07-18 14:30 | 0.234s | 1835k | Q:23