-
Notifications
You must be signed in to change notification settings - Fork 13
/
HarwareFeatures.fs
195 lines (153 loc) · 6.24 KB
/
HarwareFeatures.fs
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
namespace Examples
open System
open Aardvark.Base
open FSharp.Data.Adaptive
open Aardvark.SceneGraph
open Aardvark.Application
open Aardvark.Application.WinForms
open FSharp.Data.Adaptive.Operators
open Aardvark.Rendering
open Aardvark.Rendering.ShaderReflection
open Aardvark.Rendering.Text
open System.Runtime.InteropServices
open Aardvark.SceneGraph
open Aardvark.SceneGraph.Semantics
module HarwareFeatures =
let size = 50
let bb = Backend.GL
let game = true
let samples = 1
let newWin() =
let app =
match bb with
| Backend.GL -> new OpenGlApplication() :> IApplication
| Backend.Vulkan -> new VulkanApplication() :> IApplication
let win =
app.CreateSimpleRenderWindow(samples) :> IRenderWindow
let view =
CameraView.lookAt (V3d(6,6,6)) V3d.Zero V3d.OOI
|> DefaultCameraController.control win.Mouse win.Keyboard win.Time
|> AVal.map CameraView.viewTrafo
let proj =
win.Sizes
|> AVal.map (fun s -> Frustum.perspective 60.0 0.1 1000.0 (float s.X / float s.Y))
|> AVal.map Frustum.projTrafo
win, view, proj
let instancing() =
let cube = Primitives.unitBox
let trafos =
[|
for x in -size .. size do
for y in -size .. size do
for z in -size .. size do
yield M44f.Translation(float32 x,float32 y,float32 z) * M44f.Scale(0.3f)
|]
let call = DrawCallInfo(FaceVertexCount = cube.IndexedAttributes.[DefaultSemantic.Positions].Length, InstanceCount = trafos.Length)
let sg =
Sg.render IndexedGeometryMode.TriangleList call
|> Sg.vertexArray DefaultSemantic.Positions cube.IndexedAttributes.[DefaultSemantic.Positions]
|> Sg.vertexArray DefaultSemantic.Normals cube.IndexedAttributes.[DefaultSemantic.Normals]
|> Sg.instanceArray DefaultSemantic.InstanceTrafo trafos
|> Sg.shader {
do! DefaultSurfaces.instanceTrafo
do! DefaultSurfaces.trafo
do! DefaultSurfaces.constantColor C4f.White
do! DefaultSurfaces.simpleLighting
}
show {
display Display.Mono
backend bb
samples 8
debug false
scene sg
}
let indirect() =
let cube = Primitives.unitBox
let trafos =
[|
for x in -size .. size do
for y in -size .. size do
for z in -size .. size do
yield M44f.Translation(float32 x,float32 y,float32 z) * M44f.Scale(0.3f)
|]
let indirect =
[|
let mutable i = 0
for x in -size .. size do
for y in -size .. size do
for z in -size .. size do
//if i % 2 = 0 then
yield DrawCallInfo(FaceVertexCount = cube.IndexedAttributes.[DefaultSemantic.Positions].Length, InstanceCount = 1, FirstInstance = i)
inc &i
|]
let indirect = IndirectBuffer.ofArray indirect
let sg =
Sg.indirectDraw IndexedGeometryMode.TriangleList (AVal.constant indirect)
|> Sg.vertexArray DefaultSemantic.Positions cube.IndexedAttributes.[DefaultSemantic.Positions]
|> Sg.vertexArray DefaultSemantic.Normals cube.IndexedAttributes.[DefaultSemantic.Normals]
|> Sg.instanceArray DefaultSemantic.InstanceTrafo trafos
|> Sg.shader {
do! DefaultSurfaces.instanceTrafo
do! DefaultSurfaces.trafo
do! DefaultSurfaces.constantColor C4f.White
do! DefaultSurfaces.simpleLighting
}
show {
display Display.Mono
backend bb
samples 1
debug false
scene sg
}
let naive() =
let cube = Sg.box' C4b.Red Box3d.Unit
let template =
cube
|> Sg.shader {
do! DefaultSurfaces.trafo
do! DefaultSurfaces.constantColor C4f.White
do! DefaultSurfaces.simpleLighting
}
let template =
template.RenderObjects(Ag.Scope.Root).Content |> AVal.force |> HashSet.toList |> List.head |> unbox<RenderObject>
let win, view, proj = newWin()
let cam = view |> AVal.map (fun v -> v.Backward.TransformPosProj V3d.Zero)
let uniforms (t : Trafo3d) =
UniformProvider.ofList [
"ModelTrafo", AVal.constant t :> IAdaptiveValue
"ViewTrafo", view :> IAdaptiveValue
"CameraLocation", cam :> IAdaptiveValue
"LightLocation", cam :> IAdaptiveValue
"ProjTrafo", proj :> IAdaptiveValue
]
let objs =
ASet.ofList [
let mutable i = 0
for x in -size .. size do
for y in -size .. size do
for z in -size .. size do
let trafo = Trafo3d.Scale(0.3) * Trafo3d.Translation(float x, float y, float z)
let ro = RenderObject.Clone template
ro.Uniforms <- uniforms trafo
yield ro :> IRenderObject
]
let task = win.Runtime.CompileRender(win.FramebufferSignature, objs)
let sw = System.Diagnostics.Stopwatch()
let mutable cnt = 0
let task =
RenderTask.ofList [
task
RenderTask.custom(fun _ ->
if cnt % 50 = 0 then
let t = sw.MicroTime
printfn "%.2ffps" (50.0 / t.TotalSeconds)
sw.Restart()
cnt <- cnt + 1
)
]
win.RenderTask <- task
win.Run()
let run() =
//instancing()
//indirect()
naive()