huangcm
2025-02-24 69ed55dec4b2116a19e4cca4393cbc014fce5fb2
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
Reference Renderer Design Notes
-------------------------------
 
Requirements:
 - must support arbitrary VA arrays
 - must support primitive setup reference
 - must support lines, points
 - must support instancing
 - must support vertex shading -> custom position transformations
 - flat, noperspective shading
 - multiple render targets
 - faster shading? move packet loop inside shader
   (helper class can make shader implementation easier)
 - can be extended for tessellation and geometry shading
 
Integrate with:
 - sglr
 - random shader generator
 
Uniforms:
 - shader objects can contain parameters, renderer doesn't care about them
 - can contain simple data or references to resources (textures for example)
 
Pipeline:
 
Vertex cache:
 - based on indices setup transformed vertex buffer
 - in:
   + index list
   + VS generic output count
 - out:
   + VS execution queue
   + index remap information?
 - trivial implementation:
   + run VS for all vertices at once
 
VertexShader:
 - provides position & point size
 - transforms other vertices
 - in:
   + VertexAttrib array
   + packet list:
     + VertexID, InstanceID (pack into some accessor?)
   + uniform ptr
 - out:
   + position
   + point size
   + array of generic transformed attributes (float/int/uint)
 
Tessellation:
 - \todo [pyry] Define
 - replaces primitive assembly?
 
Primitive assembly:
 - sets up primitives
 - gl3: triangles, points, lines (adjecency?)
 - in:
   + full primitive type
   + index list
   + position & point size from VS
 - out:
   + primitive list for rasterization / geometry shading
     + positions
    + provoking vertex for flatshading
 
GeometryShader:
 - in:
   + primitive list
 - out:
   + changed primitive list
 
Coordinate transform:
 - in:
   + primitive list
 - out:
   + coordinates after viewport transform
   + z-clipping bits
 
Rasterizer:
 - pretty much as it is currently
 
FragmentShader:
 - in:
   + packet list:
     + base coordinates
    + barycentrics, both perspective and non-perspective
    + generic attribute accessor (2 or 3 vertices)
    + provoking vertex index
   + uniform ptr
 - out:
   + shaded packet list:
     + colors per render target
    + modified live mask - for discard
 - utils:
   + compute derivatives from data in SoA form
   + compute lod for texturing