articles/graphics-pipeline (#1)
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #1 Co-authored-by: light7734 <light7734@tuta.io> Co-committed-by: light7734 <light7734@tuta.io>
This commit is contained in:
parent
903d7358b0
commit
0cf1ecbb76
9 changed files with 127 additions and 3608 deletions
|
@ -7,6 +7,7 @@ steps:
|
|||
privileged: true
|
||||
image: node:latest
|
||||
commands:
|
||||
- rm -rf ./node_modules
|
||||
- npm install
|
||||
- npm run build
|
||||
- cp -r ./build/* /dazzle/
|
||||
|
|
43
package.json
43
package.json
|
@ -16,34 +16,35 @@
|
|||
"test": "npm run test:unit -- --run"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/compat": "^1.2.5",
|
||||
"@eslint/js": "^9.18.0",
|
||||
"@eslint/compat": "^1.2.8",
|
||||
"@eslint/js": "^9.25.1",
|
||||
"@sveltejs/adapter-auto": "^6.0.0",
|
||||
"@sveltejs/adapter-node": "^5.2.12",
|
||||
"@sveltejs/adapter-static": "^3.0.8",
|
||||
"@sveltejs/kit": "^2.16.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^5.0.0",
|
||||
"@tailwindcss/forms": "^0.5.9",
|
||||
"@tailwindcss/typography": "^0.5.15",
|
||||
"@tailwindcss/vite": "^4.0.0",
|
||||
"@sveltejs/kit": "^2.20.7",
|
||||
"@sveltejs/vite-plugin-svelte": "^5.0.3",
|
||||
"@tailwindcss/forms": "^0.5.10",
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"@tailwindcss/vite": "^4.1.4",
|
||||
"@testing-library/jest-dom": "^6.6.3",
|
||||
"@testing-library/svelte": "^5.2.4",
|
||||
"eslint": "^9.18.0",
|
||||
"eslint-config-prettier": "^10.0.1",
|
||||
"eslint-plugin-svelte": "^3.0.0",
|
||||
"@testing-library/svelte": "^5.2.7",
|
||||
"eslint": "^9.25.1",
|
||||
"eslint-config-prettier": "^10.1.2",
|
||||
"eslint-plugin-prettier": "^5.2.6",
|
||||
"eslint-plugin-svelte": "^3.5.1",
|
||||
"globals": "^16.0.0",
|
||||
"jsdom": "^26.0.0",
|
||||
"mdsvex": "^0.12.3",
|
||||
"prettier": "^3.4.2",
|
||||
"jsdom": "^26.1.0",
|
||||
"mdsvex": "^0.11.2",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-svelte": "^3.3.3",
|
||||
"prettier-plugin-tailwindcss": "^0.6.11",
|
||||
"svelte": "^5.0.0",
|
||||
"svelte-check": "^4.0.0",
|
||||
"tailwindcss": "^4.0.0",
|
||||
"typescript": "^5.0.0",
|
||||
"typescript-eslint": "^8.20.0",
|
||||
"vite": "^6.2.5",
|
||||
"vitest": "^3.0.0"
|
||||
"svelte": "^5.28.2",
|
||||
"svelte-check": "^4.1.6",
|
||||
"tailwindcss": "^4.1.4",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.31.0",
|
||||
"vite": "^6.3.3",
|
||||
"vitest": "^3.1.2"
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
|
|
3562
pnpm-lock.yaml
generated
3562
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
@ -1,3 +1,3 @@
|
|||
@import 'tailwindcss';
|
||||
@plugin '@tailwindcss/forms';
|
||||
@plugin '@tailwindcss/typography';
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
|
|
@ -3,6 +3,10 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
|
|
14
src/routes/articles/+layout.svelte
Normal file
14
src/routes/articles/+layout.svelte
Normal file
|
@ -0,0 +1,14 @@
|
|||
<script lang="ts">
|
||||
import './article.css';
|
||||
let { children } = $props();
|
||||
</script>
|
||||
|
||||
<div class="body">
|
||||
<div class="article_padding"></div>
|
||||
|
||||
<div class="article_body">
|
||||
{@render children()}
|
||||
</div>
|
||||
|
||||
<div class="article_padding"></div>
|
||||
</div>
|
47
src/routes/articles/article.css
Normal file
47
src/routes/articles/article.css
Normal file
|
@ -0,0 +1,47 @@
|
|||
@import "tailwindcss";
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap');
|
||||
|
||||
* {
|
||||
color: #ebdbb2;
|
||||
font-family: "Inter", sans-serif;
|
||||
font-optical-sizing: auto;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
br {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin-bottom: .3em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.7em;
|
||||
margin-bottom: .3em;
|
||||
margin-top: .6em;
|
||||
}
|
||||
|
||||
.body {
|
||||
background-color: #1d2021;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.article_body {
|
||||
flex: 3;
|
||||
margin-left: 10em;
|
||||
margin-right: 10em;
|
||||
padding: 1em;
|
||||
background-color: #282828;
|
||||
text-align: justify;
|
||||
max-width: 80ch;
|
||||
|
||||
border-left: 1px solid #7c6f64;
|
||||
border-right: 1px solid #7c6f64;
|
||||
}
|
||||
|
||||
.article_padding {
|
||||
flex: 1;
|
||||
}
|
|
@ -1,49 +1,56 @@
|
|||
# The Graphics Pipeline
|
||||
Ever wondered how games put all that gore on your display? Well you're about to find out!
|
||||
|
||||
<br/>
|
||||
At the heart of rendering, is the "Graphics Pipeline". And like any pipeline, it's comprised
|
||||
of several "stages", each of which can be a pipeline in itself or even parallelized.
|
||||
Each stage takes some input data (and configuration), to generate some output for the next stage.
|
||||
|
||||
<br/>
|
||||
We can coarsely divide the entire pipeline into 4 stages:
|
||||
Application -> [Geometry Processing] -> Rasterization -> Pixel Processing
|
||||
The pipeline will then serve a "rendered image" to your pretty eyes using your display.
|
||||
|
||||
<br/>
|
||||
But to avoid drowning you in overviews, let's jump right into the details of the "Geometry Processing"
|
||||
stage and have a recap afterwards to demystify our 4-stage division!
|
||||
|
||||
# Vertices (points in space)
|
||||
## Vertices (points in space)
|
||||
In order to render a murder scene, we need to have a way of representing the deceased in computer memory.
|
||||
We only care about the "surface" since we won't be seeing the insides anyways--We don\'t want to either.
|
||||
At this stage, we only care about the "shape" or the "geometry" of the "surface",
|
||||
texturing, lighting and all the sweet gory details comes at a much later stage once all the "geometry" has been processed.
|
||||
|
||||
<br/>
|
||||
There are several ways to "represent 3d objects" for a computer to understand.
|
||||
For instance, _NURB_(Non-uniform rational B-spline) surfaces are great for representing "curves"
|
||||
and it's all about the "high-precision" needed to do _CAD_(computer assisted design).
|
||||
We could also do "ray-tracing" using fancy equations for rendering photo-realistic images.
|
||||
|
||||
<br/>
|
||||
These are all great--ignoring the fact that they would take "an eternity" to process.
|
||||
But what we need is a hardware-friendly approach that can do this for an entire scene with
|
||||
hundereds of thousands of objects for at least 60 times undr a second. What we need is "polygonal modeling".
|
||||
|
||||
<br/>
|
||||
"Polygonal modeling" allows us to do "real-time rendering". The idea is that we only need an
|
||||
"approximation" of a surface to render it "realisticly-enough" for us to have some fun killing time!
|
||||
We can achieve this approximation using a collection of "triangles", "lines" and "dots" (primitives),
|
||||
which themselves are composed of a series of "vertices" (points in space).
|
||||
|
||||
<br/>
|
||||
A "vertex" is simply a point in space.
|
||||
Once we get enough of these "points", we can conncet them to form "primitives" such as "triangles", "lines" and "dots".
|
||||
And once we have enough "primitives" together, they form a "model" or a "mesh" (that we need for our corpse).
|
||||
With some interesting models, we can compose a "scene".
|
||||
|
||||
<br/>
|
||||
But let's not get ahead of ourselves. The primary type of "primitive" we care about during "polygonal modeling"
|
||||
is a "triangle". But why not squares or polygons with variable number of edges?
|
||||
|
||||
# Why Triangles?
|
||||
## Why Triangles?
|
||||
"Always Planar":
|
||||
Triangles can never be __non-planar__(reside in more than 1 plane)! In Euclidean geometry, any
|
||||
3
|
||||
|
||||
|
||||
"Normal surface:"
|
||||
|
@ -52,38 +59,41 @@ Triangles can never be __non-planar__(reside in more than 1 plane)! In Euclidean
|
|||
|
||||
"Predictable Winding Order:"
|
||||
|
||||
# Primitive Topologies
|
||||
## Primitive Topologies
|
||||
|
||||
# Indices
|
||||
## Indices
|
||||
|
||||
# Input Assembler
|
||||
## Input Assembler
|
||||
|
||||
# Coordinate System -- Local Space
|
||||
## Coordinate System -- Local Space
|
||||
|
||||
# Coordinate System -- World Space
|
||||
## Coordinate System -- World Space
|
||||
|
||||
# Coordinate system -- View Space
|
||||
## Coordinate system -- View Space
|
||||
|
||||
# Coordinate system -- Clip Space
|
||||
## Coordinate system -- Clip Space
|
||||
|
||||
# Coordinate system -- Screen Space
|
||||
## Coordinate system -- Screen Space
|
||||
|
||||
# Vertex Shader
|
||||
## Vertex Shader
|
||||
|
||||
# Tessellation & Geometry Shaders
|
||||
## Tessellation & Geometry Shaders
|
||||
|
||||
# Rasterizer
|
||||
## Rasterizer
|
||||
|
||||
# Pixel Shader
|
||||
## Pixel Shader
|
||||
|
||||
# Output Merger
|
||||
## Output Merger
|
||||
|
||||
# The Future
|
||||
## The Future
|
||||
|
||||
# Conclusion
|
||||
## Conclusion
|
||||
|
||||
# Sources
|
||||
## Sources
|
||||
[Tomas Akenine Moller - Real-Time Rendering 4th Edition](https://www.realtimerendering.com/intro.html)
|
||||
|
||||
<br/>
|
||||
|
||||
[LearnOpenGL - Hello Triangle](https://learnopengl.com/Getting-started/Hello-Triangle)
|
||||
[LearnOpenGL - Face Culling](https://learnopengl.com/Advanced-OpenGL/Face-culling)
|
||||
[Wikipedia - Polygonal Modeling](https://en.wikipedia.org/wiki/Polygonal_modeling)
|
|
@ -6,7 +6,12 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
|
|||
const config = {
|
||||
// Consult https://svelte.dev/docs/kit/integrations
|
||||
// for more information about preprocessors
|
||||
preprocess: [vitePreprocess(), mdsvex()],
|
||||
preprocess: [
|
||||
vitePreprocess(),
|
||||
mdsvex({
|
||||
extensions: ['.md', '.svx'],
|
||||
})
|
||||
],
|
||||
|
||||
kit: {
|
||||
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
|
||||
|
@ -15,8 +20,7 @@ const config = {
|
|||
adapter: adapter()
|
||||
},
|
||||
|
||||
extensions: ['.svelte', '.svx']
|
||||
extensions: ['.svelte', '.svx', '.md']
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue