@Jatothrim: Juu, optimointia on vielä tehtävissä paljonkin, mikäli haluaa rutistaa ne viimeiset FPS:t irti. Olennaisinta olisi tallennella matriisien välivaiheita vähän enemmän kuin nyt teen, laskemisosuus pienenisi huomattavasti. Kolmioiden uudelleenluonti joka framella on siinä mielessä kiva ettei niistä tarvitse funktioita käytettäessä pitää mitään lukua, toimii samaan tapaan kuin piirtokomennot. Ja pullonkaula ei todellakaan ole sorttaus tai tyypin jäsenten luonti ja poistelu, kyllä se trifill vie ehdottomasti eniten aikaa vaikka lukittuna piirtääkin.
@Pate5, kyllä vaan, tuo näyttää jo huomattavasti paremmalta (: tietysti ne voisi laskea ihan pintojen normaaleista kuten olin aiemmassa kartiosysteemissä tehnyt, voisin kohta väsäillä sellaisen version.
EDIT:tässäpä tätä.
Code: Select all
Const w = 400
Const h = 300
Const cop = 800 // w*2
SCREEN w*2, h*2
Global ldirx As Float
Global ldiry As Float
Global ldirz As Float
ldirx=-1.0
ldiry=2.0
ldirz=-4.0
ldirL# = Sqrt(ldirx*ldirx+ldiry*ldiry+ldirz*ldirz)
ldirx = ldirx/ldirL#
ldiry = ldiry/ldirL#
ldirz = ldirz/ldirL#
Type kgl_tris
Field x1
Field y1
Field x2
Field y2
Field x3
Field y3
Field r
Field g
Field b
EndType
Type kgl_matrix
Field a#
Field b#
Field c#
Field d#
Field e#
Field f#
Field g#
Field h#
Field i#
Field j#
Field k#
Field l#
Field m#
Field n#
Field o#
Field p#
EndType
Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0
kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1
kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)
kgl_curmatrix = kgl_identity
Function kgl_setworldmatrix(newmatrix)
kgl_curmatrix = newmatrix
EndFunction
Function kgl_getrotation(ang#, axx#, axy#, axz#)
sina# = Sin(ang*.5)
qx# = axx#*sina#
qy# = axy#*sina#
qz# = axz#*sina#
qw# = Cos(ang*.5)
L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
m.kgl_matrix = New(kgl_matrix)
m\a = 1-2*(qy*qy+z*z)
m\b = 2*(qx*qy-qz*qw)
m\c = 2*(qx*qz+qy*qw)
m\d = 0
m\e = 2*(qx*qy+qz*qw)
m\f = 1-2*(qx*qx+qz*qz)
m\g = 2*(qy*qz-qx*qw)
m\h = 0
m\i = 2*(qx*qz-qy*qw)
m\j = 2*(qy*qz+qx*qw)
m\k = 1-2*(qx*qx+qy*qy)
m\l = 0
m\m = 0
m\n = 0
m\o = 0
m\p = 1
Return ConvertToInteger(m)
EndFunction
Function kgl_gettranslation(x#, y#, z#)
m.kgl_matrix = New(kgl_matrix)
m\a=1:m\b=0:m\c=0:m\d=0
m\e=0:m\f=1:m\g=0:m\h=0
m\i=0:m\j=0:m\k=1:m\l=0
m\m=x:m\n=y:m\o=z:m\p=1
Return ConvertToInteger(m)
EndFunction
Function kgl_multiply_matrix(m1_id, m2_id)
m.kgl_matrix = New(kgl_matrix)
m1.kgl_matrix = ConvertToType(m1_id)
m2.kgl_matrix = ConvertToType(m2_id)
m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p
m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p
m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p
m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p
Return ConvertToInteger(m)
EndFunction
Function render()
kgl_used_triangles = kgl_used_triangles - 1
If(kgl_used_triangles >1) Then sort()
Lock
For i = 0 To kgl_used_triangles
t.kgl_tris = ConvertToType(kgl_t_id(i))
filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
Delete t
Next i
Unlock
kgl_used_triangles = 0
EndFunction
Function sort()
changes = 1
gap# = kgl_used_triangles
Repeat
gap = gap/1.247330950103979
If gap = 10 Or gap = 9
gap = 11
EndIf
If gap<=1 Then gap = 1
changes = 0
For i = 0 To (kgl_used_triangles-gap)
igap = i + gap
If (kgl_t_z(i)<kgl_t_z(igap)) Then
tempz# = kgl_t_z(i)
tempid% = kgl_t_id(i)
kgl_t_z(i) = kgl_t_z(igap)
kgl_t_id(i) = kgl_t_id(igap)
kgl_t_z(igap) = tempz#
kgl_t_id(igap) = tempid%
changes = 1
EndIf
Next i
Until changes = 0 And gap=1
EndFunction
Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
Color r, g, b
If (y1>y2) Then
tmpy = y1
tmpx = x1
y1 = y2
x1 = x2
y2 = tmpy
x2 = tmpx
EndIf
If (y1>y3) Then
tmpy = y1
tmpx = x1
y1 = y3
x1 = x3
y3 = tmpy
x3 = tmpx
EndIf
If (y2>y3) Then
tmpy = y2
tmpx = x2
y2 = y3
x2 = x3
y3 = tmpy
x3 = tmpx
EndIf
If(y2=y1) Then y1-0.001
If(y3=y2) Then y3+0.001
slp1# = (x3-x1)/(y3-y1)
slp2# = (x2-x1)/(y2-y1)
slp3# = (x3-x2)/(y3-y2)
If(Int(y1)<Int(y2)) Then
For i = y1 To y2
Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
Next i
EndIf
If(Int(y2)<Int(y3)) Then
For i = y2 To y3
Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
Next i
EndIf
EndFunction
Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)
m.kgl_matrix = ConvertToType(kgl_curmatrix)
nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
x1 = nx1: y1 = ny1: z1 = nz1
nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
x2 = nx2: y2 = ny2: z2 = nz2
nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
x3 = nx3: y3 = ny3: z3 = nz3
If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
s1# = (1.0/z1#)*cop
s2# = (1.0/z2#)*cop
s3# = (1.0/z3#)*cop
t.kgl_tris = New(kgl_tris)
t\x1 = Int(s1*x1+w)
t\y1 = Int((-s1)*y1+h)
t\x2 = Int(s2*x2+w)
t\y2 = Int((-s2)*y2+h)
t\x3 = Int(s3*x3+w)
t\y3 = Int((-s3)*y3+h)
If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
nx1# = x2-x1
nx2# = x3-x1
ny1# = y2-y1
ny2# = y3-y1
nz1# = z2-z1
nz2# = z3-z1
normx# = ny1*nz2-nz1*ny2
normy# = nz1*nx2-nx1*nz2
normz# = nx1*ny2-ny1*nx2
normL# = Sqrt(normx*normx+normy*normy+normz*normz)
normx = normx / normL
normy = normy / normL
normz = normz / normL
light# = Max(0, normx*ldirx+normy*ldiry+normz*ldirz)
t\r = light*Float(r)
t\g = light*Float(g)
t\b = light*Float(b)
kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
kgl_used_triangles = kgl_used_triangles + 1
EndFunction
Function drawcube(r, g, b)
tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction
Repeat
ang# = ang# - 1.0
For j = 0 To 3
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
For i = 0 To 4
kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
col = 50+i*20
drawcube(col, col, col)
Next i
Next j
render()
Color 255, 255, 255
Text 10, 10, Str(FPS())
DrawScreen
Forever
@MaGetzUb, tässä on pointtina juurikin CB:n omien tehojen mittailu, ulkoisella DLL:llähän saisi aikaan vaikka mitä graafisia hulppeuksia.
(nuolet+w/s+x), jos tästä vaikka jonkun shmupin vääntäisi.