This commit is contained in:
parent
cb1548c0ef
commit
8c4171319b
1 changed files with 62 additions and 30 deletions
|
@ -324,10 +324,10 @@ Which allows **vertex reuse** and reduces memory usage by preventing duplicate v
|
|||
Imagine the following scenario:
|
||||
```cc
|
||||
float triangle_vertices[] = {
|
||||
// x__, y__, z__
|
||||
0.0, 0.5, 0.0, // center top
|
||||
-0.5, -0.5, 0.0, // bottom left
|
||||
0.5, -0.5, 0.0, // bottom right
|
||||
// x__, y__
|
||||
0.0, 0.5, // center top
|
||||
-0.5, -0.5, // bottom left
|
||||
0.5, -0.5, // bottom right
|
||||
};
|
||||
```
|
||||
|
||||
|
@ -335,16 +335,16 @@ Here we have one triangle primitive, cool! Now let's create a rectangle:
|
|||
```cc
|
||||
float vertices[] = {
|
||||
// first triangle
|
||||
// x__ y__ z__
|
||||
0.5, 0.5, 0.0, // top right
|
||||
0.5, -0.5, 0.0, // bottom right << DUPLICATE
|
||||
-0.5, 0.5, 0.0, // top left << DUPLICATE
|
||||
// x__ y__
|
||||
0.5, 0.5, // top right
|
||||
0.5, -0.5, // bottom right << DUPLICATE
|
||||
-0.5, 0.5, // top left << DUPLICATE
|
||||
|
||||
// second triangle
|
||||
// x__ y__ z__
|
||||
0.5, -0.5, 0.0, // bottom right << DUPLICATE
|
||||
-0.5, -0.5, 0.0, // bottom left
|
||||
-0.5, 0.5, 0.0, // top left << DUPLICATE
|
||||
// x__ y__
|
||||
0.5, -0.5, // bottom right << DUPLICATE
|
||||
-0.5, -0.5, // bottom left
|
||||
-0.5, 0.5, // top left << DUPLICATE
|
||||
};
|
||||
```
|
||||
|
||||
|
@ -356,11 +356,11 @@ indexed rendering:
|
|||
```cc
|
||||
float vertices[] = {
|
||||
// first triangle
|
||||
// x__ y__ z__
|
||||
0.5, 0.5, 0.0, // top right
|
||||
0.5, -0.5, 0.0, // bottom right
|
||||
-0.5, -0.5, 0.0, // bottom left
|
||||
-0.5, 0.5, 0.0, // top left
|
||||
// x__ y__
|
||||
0.5, 0.5, // top right
|
||||
0.5, -0.5, // bottom right
|
||||
-0.5, -0.5, // bottom left
|
||||
-0.5, 0.5, // top left
|
||||
};
|
||||
|
||||
unsigned int indices[] = {
|
||||
|
@ -389,7 +389,7 @@ I'll explain how vertices are transformed soon, don't worry (yet).
|
|||
## **Input Assembler**
|
||||
Alrighty! Do we have everything we need?
|
||||
|
||||
We got our **vertices** to represent geometry. We set our **primitive topology** to determine
|
||||
We got our surface representation---**vertices**. We set the **primitive topology** to determine
|
||||
how to concatenate them. And we optionally (but most certainly) provided some **indices** to avoid
|
||||
duplicate vertex data.
|
||||
|
||||
|
@ -398,28 +398,60 @@ the **input assembler**. Which as stated before, is responsible for **assembling
|
|||
|
||||
<Note type="diagram", title="Geometry Processing">
|
||||
|
||||
[Vertex/Index Data] --> Input Assembler --> ...
|
||||
|
||||
</Note>
|
||||
|
||||
So what comes next?
|
||||
|
||||
## Coordinate System -- Overview
|
||||
We got our surface representation (vertices), we got our indices, we set the primitive topology type, and we gave these
|
||||
to the **input assembler** to spit out triangles for us.
|
||||
|
||||
**Assembling primitives** is the **first** essential task in the **geometry processing** stage, and
|
||||
everything you read so far only went over that part.
|
||||
Its **second** vital responsibility is the **transformation** of the said primitives. Let me explain.
|
||||
|
||||
So far, all the examples show the geometry in NDC (Normalized Device Coordinates).
|
||||
This is because the **rasterizer** expects the final vertex coordinates to be in the NDC range.
|
||||
Anything outside of this range is **clipped** henceforth not visible.
|
||||
So far, our examples show the geometry in **normalized device coordinates**; or **NDC** for short.
|
||||
This is a small space where the x, y and z values are in range of [-1.0 -> 1.0].
|
||||
Anything outside this range will be **clipped** and won't be visible on screen.
|
||||
Below is our old triangle again which was specified within **NDC**---ignoring the z for now:
|
||||
|
||||
```cc
|
||||
float triangle_vertices[] = {
|
||||
// x__, y__
|
||||
0.0, 0.5, // center top
|
||||
-0.5, -0.5, // bottom left
|
||||
0.5, -0.5, // bottom right
|
||||
};
|
||||
```
|
||||
|
||||
This is because the **rasterizer** expects the **final vertex coordinates** to be in the **NDC** range.
|
||||
Anything outside of this range is, again, **clipped** and not visible.
|
||||
|
||||
Yet, as you might imagine, doing everything in the **NDC** is inconvenient and very limiting.
|
||||
We'd like to be able to **compose** a scene by <Tip text="transforming">Scale, Rotate, Translate. </Tip> some objects around. And **interact**
|
||||
with the scene by moving and looking around ourselves.
|
||||
|
||||
This is done by transforming these vertices through **5 coordinate systems** before ending up in NDC
|
||||
(or outside of if they're meant to be clipped). Let's get a coarse overview:
|
||||
|
||||
**Local Space**: This is where your object begins in, think of it as the data exported from a model
|
||||
using Blender. If we were to modify an object it would make most sense to do it here.
|
||||
|
||||
**World Space**: All objects will be stuck into each other at coordinates 0, 0, 0 if we don't move them
|
||||
around the world. This is the transformation that puts your object in the context of the **world**.
|
||||
|
||||
**View Space**: Then we transform everything that was relative to the world in such a way that each
|
||||
vertex is seen from the viewer's point of view.
|
||||
|
||||
**Clip Space**: Then we project everything to the clip coordinates, which is in the range of -1.0 and 1.0.
|
||||
This projection is what makes **perspective** possible (distant objects appearing smaller).
|
||||
|
||||
**Screen Space**: This one is out of our control, it simply puts our now normalized coordinates
|
||||
unto the screen.
|
||||
|
||||
As you can see each of these coordinates systems serve a specific purpose and allows **composition** and **interaction** with a scene.
|
||||
However, doing these **transformations** require a lot of **linear algebra**, specifically **matrix operations**.
|
||||
So before we get into more depth about coordinate systems, let's learn how to do **linear transformations**!
|
||||
|
||||
Yet, as you'll understand soon, doing everything in the **NDC** is inconvenient and very limiting.
|
||||
What we'd like to do is to transform these vertices through 5 different coordinate systems before ending up in NDC
|
||||
(or outside of if they're meant to be clipped).
|
||||
The purpose of each space will be explained shortly. But doing these **transformations** require
|
||||
a lot of **linear algebra**, specifically **matrix operations**.
|
||||
So let's get some refresher on the concepts
|
||||
|
||||
<Note title="Algebra Ahead!">
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue