Geen idee of het toegestaan is maar ik hou hier toch maar een beetje bij waar ik mee bezig ben. Beter dat de mensen hier komen kijken dan op gamedev lijkt me!
Allereerst hier de planeet zoals die op het moment gerenderd wordt. Textures zijn 'placeholders' en wordt nog compleet aangepast. Ook de heightdata is een simpele 50 octaves turbulence 3d noise tex.
Frustum + Horizon Culling geimplementeerd. Alleen patches die in de view frustum en zichtbaar zijn (geen occluders zoals horizon) worden naar de gpu gestuurd. De zwarte punt is de camerapositie, lichte gedeelte het gecullde:
Ook het zeer ingewikkelde stitching bleek verdomde makkelijk! If neighbour_lod < my_lod then stitch. Simpelweg in de vertex buffer vertexen 'verplaatsen' om zodoende een waaier te krijgen:
Voor geintresseerden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| /* //
// //
// STITCHING //
// //
// */
// if vertex is uneven its 1, else its 0.
float2 UnevenVertex = (input.gridPos.xy) % 2;
float2 localPos = (input.gridPos.xy)/(PatchSize-1)*2-1;
// if border, perform stitching
if (localPos.y == -1)
{
input.gridPos.x = input.gridPos.x + UnevenVertex.x*(localPos.y*pow(input.LodChange.x,2));
}
else if (localPos.y == 1)
{
input.gridPos.x = input.gridPos.x + UnevenVertex.x*(localPos.y*pow(input.LodChange.z,2));
}
else if (localPos.x == -1)
{
input.gridPos.y = input.gridPos.y + UnevenVertex.y*(localPos.x*pow(input.LodChange.w,2));
}
else if (localPos.x == 1)
{
input.gridPos.y = input.gridPos.y + UnevenVertex.y*(localPos.x*pow(input.LodChange.y,2));
} |
Patchsize: Aantal vertexen per patch
gridPos: vertexpositie relatief aan de patch: patchsize = 15, gridpos:[0;14]
lodChange: x=top, y=right, z=bottom, w = left. bool met daarin of neighbour resolutie kleiner is. Zo ja stitchen!
Veel bereikt in een aantal dagen om het zo maar te zeggen.
De engine voert overigens maar 1 drawcall per 'zijde' van de planeet uit (6 stuks dus). Alle heightdata wordt bij split gerendert naar een texture-atlas. bij de update-pre/render vul ik een instancebuffer met de positie, neighbour-data en patch-id. Vervolgens zoek ik tijdens de render in de atlas de goede patch op. Zorgt er dus voor dat de draw calls geminimaliseerd worden.
PS. let ook op de heerlijk hoge framerates!!
Er zijn echter nog dingen waar ik naar op zoek ben. En dat is met name een 'split-schema'. Dat wil zeggen, wanneer moet ik een node laten splitten in 4 kinderen? Ik heb het nu lineair vanaf een vooringestelde afstand. en dan als afstand de helft wordt, split ik. Het lijkt me dat dit beter moet kunnen! Iemand ideeën?
Coming up: Normal mapping & diffuse lighting!
[
Voor 7% gewijzigd door
Mischa_NL op 15-01-2010 02:51
]