Update
This commit is contained in:
parent
62a042b858
commit
ba42573522
5 changed files with 76 additions and 13 deletions
|
@ -8,6 +8,12 @@ The most basic fact to know about corporations is that **100% of everything a co
|
||||||
|
|
||||||
A corporation is made to exploit people just as a gun is made to kill people. When a corporation commits a crime, it is not punished like a human would be, the corporation is left to exist and continue doing what it has been doing -- a supposed "punishment" for a corporation that has been caught red handed committing a crime is usually just replacing whoever is ruled to be "responsible", for example the CEO, which is of course ridiculous, the guy is just replaced with someone else who will do exactly the same. This is like trying to fix the lethal nature of a weapon by putting all the blame on a screw in the weapon, then replacing the screw with another one and expecting the weapon to no longer serve killing people.
|
A corporation is made to exploit people just as a gun is made to kill people. When a corporation commits a crime, it is not punished like a human would be, the corporation is left to exist and continue doing what it has been doing -- a supposed "punishment" for a corporation that has been caught red handed committing a crime is usually just replacing whoever is ruled to be "responsible", for example the CEO, which is of course ridiculous, the guy is just replaced with someone else who will do exactly the same. This is like trying to fix the lethal nature of a weapon by putting all the blame on a screw in the weapon, then replacing the screw with another one and expecting the weapon to no longer serve killing people.
|
||||||
|
|
||||||
|
It is always better for a corporation to not exist than vice versa. The [proof](proof.md) is following:
|
||||||
|
|
||||||
|
1. It is better to have no corporation than an evil corporation.
|
||||||
|
2. Corporation is always evil.
|
||||||
|
3. Therefore it is always better for a corporation to not exist. QED
|
||||||
|
|
||||||
There is probably nothing we can do to stop corporations from taking over the world and eventually eliminating humans, we have probably passed the **[capitalist singularity](capitalist_singularity.md)**.
|
There is probably nothing we can do to stop corporations from taking over the world and eventually eliminating humans, we have probably passed the **[capitalist singularity](capitalist_singularity.md)**.
|
||||||
|
|
||||||
TODO
|
TODO
|
49
gopher.md
49
gopher.md
|
@ -1,10 +1,10 @@
|
||||||
# Gopher
|
# Gopher
|
||||||
|
|
||||||
Gopher is a network [protocol](protocol.md) for publishing, browsing and downloading files and is known as a much simpler alternative to the [World Wide Web](www.md) (i.e. to [HTTP](http.md) and [HTML](html.md)). In fact it competed with the Web in its early days and even though the Web won in the mainstream, gopher still remains used by a small communities (however the more dedicated, see e.g. [bitreich](bitreich.md)). Gopher is like the Web but well designed, it is the [suckless](suckless.md)/[KISS](kiss.md) way of doing what the Web does, it contains practically no [bloat](bloat.md) and so [we](lrs.md) highly advocate its use. Gopher inspired creation of [Gemini](gemini.md), a similar but bit more complex and "[modern](modern.md)" protocol, and the two together have recently become the main part of so called [Smol Internet](smol_internet.md). Gopher is much better than Gemini though.
|
Gopher is a network [protocol](protocol.md) for publishing, browsing and downloading files and is known as a much simpler alternative to the [World Wide Web](www.md) (i.e. to [HTTP](http.md) and [HTML](html.md)). In fact it competed with the Web in its early days and even though the Web won in the mainstream, gopher still remains used by a small communities (however the more dedicated, see e.g. [bitreich](bitreich.md)). Gopher is like the Web but well designed, it is the [suckless](suckless.md)/[KISS](kiss.md) way of doing what the Web does, it contains practically no [bloat](bloat.md) and so [we](lrs.md) highly advocate its use. Gopher inspired creation of [Gemini](gemini.md), a similar but bit more complex and "[modern](modern.md)" protocol, and the two together have recently become the main part of so called [Smol Internet](smol_internet.md). Gopher is much better than Gemini though. The set of all public gopher servers is called gopherspace.
|
||||||
|
|
||||||
As of 2023 the Veronica search engine reported 315 gopher servers in the world with 5+ million indexed selectors. Quarry search engine reports 369 servers and 1+ million indexed selectors. Gopher LAWN directory (made by [bitreich](bitreich.md)) contains 281 selected quality gopher holes.
|
Gopher **doesn't use any [encryption](encryption.md)** (though some server allow access via [Tor](tor.md)). **This is good, encryption is [bloat](bloat.md)**. Gopher also doesn't really know or care about [Unicode](unicode.md) and similar bloat (which mostly serves trannies to insert emojis of pregnant men into readmes anyway, we don't need that), it's basically just [ASCII](ascii.md). Gopher simple design is intentional, the authors deemed simplicity a [good](good.md) feature. Gopher is so simple that you may very well write your own client and server and comfortably use them -- **you can even browse gopher just by manually using [telnet](telnet.md)** to communicate with the server.
|
||||||
|
|
||||||
Gopher **doesn't use any [encryption](encryption.md)**. This is good, encryption is [bloat](bloat.md). Gopher also **only uses [ASCII](ascii.md)**, i.e. there's no [Unicode](unicode.md). That's also good, Unicode is bloat (and mostly serves trannies to insert emojis of pregnant men into readmes, we don't need that). Gopher simple design is intentional, the authors deemed simplicity a good feature. Gopher is so simple that you may very well write your own client and server and comfortably use them (it is also practically possible to browse gopher without a specialized client, just with standard [Unix](unix.md) [CLI](cli.md) tools).
|
**How big is gopherspace?** As of 2023 the Veronica search engine reported 315 gopher servers in the world with 5+ million indexed selectors, which they estimated was 83% of the whole gopherspace (the peak server count was in 2020 at almost 400). Quarry search engine reports 369 servers and 1+ million indexed selectors. Contrition search engine reported even 495 servers and 7+ million selectors. Gopher LAWN directory (made by [bitreich](bitreich.md)) contains 281 selected quality gopher holes.
|
||||||
|
|
||||||
From the user's perspective the most important distinction from the Web is that gopher is based on **menus** instead of "webpages"; a menu is simply a column of items of different predefined types, most importantly e.g. a *text file* (which clients can directly display), *directory* (link to another menu), *text label* (just shows some text), *binary file* etc. A menu can't be formatted or visually changed, there are no colors, images, scripts or [hypertext](hypertext.md) -- a menu is not a presentation tool, it is simply a navigation node towards files users are searching for (but the mentioned ASCII art and label items allow for somewhat mimicking "websites" anyway). Addressing works with [URLs](url.md) just as the Web, the URLs just differ by the protocol part (`gopher://` instead of `http://`), e.g.: `gopher://gopher.floodgap.com:70/1/gstats`. What on Web is called a "website" on gopher we call a **gopherhole** (i.e. a collection of resources usually under a single [domain](domain.md)) and the whole gopher network is called a **gopherspace**. [Blogs](blog.md) are common on gopher and are called **phlogs** (collectively a *phlogosphere*). As menus can refer to one another, gopher creates something akin a **global [file system](file_system.md)**, so browsing gopher is like browsing folders and can comfortably be handled with just 4 arrow keys. Note that as menus can link to any other menu freely, the structure of the "file system" is not a [tree](tree.md) but rather a general [graph](graph.md). Another difference from the Web is gopher's great emphasis on **[plaintext](plaintext.md) and [ASCII art](ascii_art.md)** as it cannot embed images and other media in the menus (even though of course the menus can link to them). There is also a support for sending text to a server so it is possible to implement [search engines](search_engine.md), guest books etc.
|
From the user's perspective the most important distinction from the Web is that gopher is based on **menus** instead of "webpages"; a menu is simply a column of items of different predefined types, most importantly e.g. a *text file* (which clients can directly display), *directory* (link to another menu), *text label* (just shows some text), *binary file* etc. A menu can't be formatted or visually changed, there are no colors, images, scripts or [hypertext](hypertext.md) -- a menu is not a presentation tool, it is simply a navigation node towards files users are searching for (but the mentioned ASCII art and label items allow for somewhat mimicking "websites" anyway). Addressing works with [URLs](url.md) just as the Web, the URLs just differ by the protocol part (`gopher://` instead of `http://`), e.g.: `gopher://gopher.floodgap.com:70/1/gstats`. What on Web is called a "website" on gopher we call a **gopherhole** (i.e. a collection of resources usually under a single [domain](domain.md)) and the whole gopher network is called a **gopherspace**. [Blogs](blog.md) are common on gopher and are called **phlogs** (collectively a *phlogosphere*). As menus can refer to one another, gopher creates something akin a **global [file system](file_system.md)**, so browsing gopher is like browsing folders and can comfortably be handled with just 4 arrow keys. Note that as menus can link to any other menu freely, the structure of the "file system" is not a [tree](tree.md) but rather a general [graph](graph.md). Another difference from the Web is gopher's great emphasis on **[plaintext](plaintext.md) and [ASCII art](ascii_art.md)** as it cannot embed images and other media in the menus (even though of course the menus can link to them). There is also a support for sending text to a server so it is possible to implement [search engines](search_engine.md), guest books etc.
|
||||||
|
|
||||||
|
@ -12,11 +12,50 @@ Gopher is just an [application layer](l7.md) [protocol](protocol.md) (officially
|
||||||
|
|
||||||
**Gopher [software](software.md)**: sadly "[modern](modern.md)" browsers are so modern they have millions of lines of code but can't be bothered to support such a trivial protocol like gopher, however there are Web proxies you can use to explore gopherspace (look up e.g. floodgap). Better browsers such as [lynx](lynx.md) (terminal), [sacc](sacc.md), [clic](clic.md) or [forg](forg.md) ([GUI](gui.md)) can be used for browsing gopherspace natively (it's not hard, you don't need to learn any keybinds, using arrow keys usually just works). As a server you may use e.g. Gophernicus (used by [SDF](sdf.md)) or search for another one, there are dozens. { Personally I've used gophrier for server, it was the simplest one I found. ~drummyfish } For the creation of gophermaps you simply use a plaintext editor. **Where to host gopher?** [Pubnixes](pubnix.md) such as [SDF](sdf.md), [tilde.town](tilde_town.md) and [Circumlunar community](circumlunar.md) offer gopher hosting but many people simply [self-host](self_hosting.md) servers e.g. on [Raspberry Pis](rpi.md), it's pretty simple.
|
**Gopher [software](software.md)**: sadly "[modern](modern.md)" browsers are so modern they have millions of lines of code but can't be bothered to support such a trivial protocol like gopher, however there are Web proxies you can use to explore gopherspace (look up e.g. floodgap). Better browsers such as [lynx](lynx.md) (terminal), [sacc](sacc.md), [clic](clic.md) or [forg](forg.md) ([GUI](gui.md)) can be used for browsing gopherspace natively (it's not hard, you don't need to learn any keybinds, using arrow keys usually just works). As a server you may use e.g. Gophernicus (used by [SDF](sdf.md)) or search for another one, there are dozens. { Personally I've used gophrier for server, it was the simplest one I found. ~drummyfish } For the creation of gophermaps you simply use a plaintext editor. **Where to host gopher?** [Pubnixes](pubnix.md) such as [SDF](sdf.md), [tilde.town](tilde_town.md) and [Circumlunar community](circumlunar.md) offer gopher hosting but many people simply [self-host](self_hosting.md) servers e.g. on [Raspberry Pis](rpi.md), it's pretty simple.
|
||||||
|
|
||||||
|
**A quick [tl;dr](tldr.md)/sumup of the gopher world/community** as of 2023: thankfully there doesn't seem to be much [censorship](censorship.md) and/or woke toxicity that's seen on the web, the community is still quite small, which is probably a GOOD thing; an issue/downside at this time seems to be a "self serving" nature of gopher ("come to gopher to learn about gopher"), i.e. instead of gopher being a "platform" for sharing all kinds of information, we mostly have a gopher community talking about gopher, so outsiders really have nothing to come in for. Of course there is interesting information of other kinds, but the overall impression is just this. Apart from this gopherspace seems to be mostly divided into following gopherholes:
|
||||||
|
|
||||||
|
- big center [hubs](hub.md) (floodgap, bitreich, ...): Stable holes providing info and tutorials for newcomers, links to important resources, manifestos, sometimes providing a search engine or directory of other holes.
|
||||||
|
- phlogs and personal holes: Small holes with "hello world messages" and personal rants, usually about gopher and related topics such as technology [minimalism](minimalism.md), independent living etc.
|
||||||
|
- socializing/roleplay [pubnices](pubnix.md) offering hosting (circumlunar, [SDF](sdf.md), tilde town, ...): Smaller noncommercial communities in the spirit of old [BBS](bbs.md)es, they offer user account, ssh access to their [Unix](unix.md) servers, email, web and gopher hosting space, chat, [games](game.md) etc. Sometimes they are roleplay focused, having some sci-fi backstory or something. They don't ask for any fees, however all seem to REQUIRE active participation in the community or else they'll delete your account -- this sucks big time for asocial introverts who just want a gopher hole without being forced to play with other kids.
|
||||||
|
- web proxies (gopherpedia, gophreddit): Mirrors/proxies to popular websites such as [Wikipedia](wikipedia.md), project gutenberg, [reddit](reddit.md) etc.
|
||||||
|
|
||||||
**Some basic/interesting gopher links**: gopher://bitreich.org/1/lawn (directory of gopher holes), gopher://gopher.floodgap.com/7/v2/vs (search engine), gopher://circumlunar.space:70/1 (circumlunar space), gopher://gopherpedia.com ([Wikipedia](wikipedia.md) on gopher), gopher://gopher.icu/7/quarry (search engine), ...
|
**Some basic/interesting gopher links**: gopher://bitreich.org/1/lawn (directory of gopher holes), gopher://gopher.floodgap.com/7/v2/vs (search engine), gopher://circumlunar.space:70/1 (circumlunar space), gopher://gopherpedia.com ([Wikipedia](wikipedia.md) on gopher), gopher://gopher.icu/7/quarry (search engine), ...
|
||||||
|
|
||||||
## How To
|
## How To
|
||||||
|
|
||||||
For now take a look at stuff in this repo: `git clone git://bitreich.org/gopher-tutorials/`.
|
Here is a nice tutorial: `git clone git://bitreich.org/gopher-tutorials/`.
|
||||||
|
|
||||||
|
To quickly try browsing gopher either use a web proxy, e.g. at https://gopher.floodgap.com/gopher/gw.lite, or use some nice native browser, e.g. `lynx gopher://floodgap.com`.
|
||||||
|
|
||||||
|
More technical details: just as with the web, you have some gopher [server](server.md) running somewhere (some [IP address](ip_address.md)/[domain](domain.md), on [port](port.md) 70) which serves resources to [clients](client.md). A client connects to the server (via [TCP](tcp.md)) and simply sends the name of the resource (file or directory) it wants to retrieve as a [string](string.md) ending with a newline. If the string is empty, the server sends the default directory (the "main page"). You may try this manually in terminal using [telnet](telnet.md), [nc](nc.md) or a similar tool. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
echo "" | nc floodhap.com 70
|
||||||
|
```
|
||||||
|
|
||||||
|
The server just sends us back a list of available resources in the "main directory", one per line, each in format:
|
||||||
|
|
||||||
|
```
|
||||||
|
<TYPE><DISPLAY_STRING><TAB><PATH><TAB><SERVER><TAB><PORT>
|
||||||
|
```
|
||||||
|
|
||||||
|
For example one of the lines here looks like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
1Search Gopherspace with Veronica-2 <TAB> /v2 <TAB> gopher.floodgap.com <TAB> 70
|
||||||
|
```
|
||||||
|
|
||||||
|
Here `1` says the resource is a directory, then we have a display string (which you'll see in the browser), then the path to the resource, i.e. `/v2`, and then the server and port. If we want to retrieve this directory, we send:
|
||||||
|
|
||||||
|
```
|
||||||
|
echo "/v2" | nc floodhap.com 70
|
||||||
|
```
|
||||||
|
|
||||||
|
And get a similar response. This is basically a client needs to know.
|
||||||
|
|
||||||
|
As for running a server, details depend on each one, but generally they behave like this: you have a server running in some default directory, let's say `/home/me/my_gopherhole`. By default a server will just serve list of files present in this directory to clients who request the "main directory", treating directories as subdirectories and sending regular files back. However there is one important feature: you may create a **gophermap file** to create a custom menu, or something aking a "gopher website". Gophermap is something like gopher's [HTML](html.md), just much more simple. How to do this? You simply create a file name `gophermap` in the directory (the main one or any subdirectory) -- if the server sees such a file, it serves it instead of listing the directory file.
|
||||||
|
|
||||||
|
TODO: continue
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
|
@ -24,6 +63,6 @@ TODO
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
- [gemini](gemini.md)
|
- [Gemini](gemini.md)
|
||||||
- [Fediverse](fediverse.md)
|
- [Fediverse](fediverse.md)
|
||||||
- [smol internet](smol_internet.md)
|
- [smol internet](smol_internet.md)
|
|
@ -33,3 +33,7 @@ Pseudoleft is extra harmful by deceiving the public into thinking what it does r
|
||||||
Why is there no pseudoright? Because it doesn't make sense :) Left is good, right is a sincere evil and pseudoleft is an evil pretending to be good. A good pretending to be evil doesn't probably exist in any significant form.
|
Why is there no pseudoright? Because it doesn't make sense :) Left is good, right is a sincere evil and pseudoleft is an evil pretending to be good. A good pretending to be evil doesn't probably exist in any significant form.
|
||||||
|
|
||||||
**Centrism** means trying to stay somewhere mid way between left and right, but it comes with issues. From our point of view it's like trying to stay in the middle of good and evil, it is definitely pretty bad to decide to be 50% evil. Another issue with centrism is that it is **unstable**. Centrism means balancing on the edge of two opposing forces and people naturally tend to slip towards the extremes, so a young centrist will have about equal probabilities of slipping either towards extreme left or extreme right, and as society polarizes this way, people become yet more and more inclined to defend their team. Knowing centrism is unsustainable, we realize we basically have to choose which extreme to join, and we choose the left extreme, i.e. joining the good rather than the evil.
|
**Centrism** means trying to stay somewhere mid way between left and right, but it comes with issues. From our point of view it's like trying to stay in the middle of good and evil, it is definitely pretty bad to decide to be 50% evil. Another issue with centrism is that it is **unstable**. Centrism means balancing on the edge of two opposing forces and people naturally tend to slip towards the extremes, so a young centrist will have about equal probabilities of slipping either towards extreme left or extreme right, and as society polarizes this way, people become yet more and more inclined to defend their team. Knowing centrism is unsustainable, we realize we basically have to choose which extreme to join, and we choose the left extreme, i.e. joining the good rather than the evil.
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
- [SJW](sjw.md)
|
12
sjw.md
12
sjw.md
|
@ -3,3 +3,15 @@
|
||||||
Social [justice](justice.md) [warrior](fight_culture.md) (SJW) is an especially active, [toxic](toxic.md) and aggressive kind of [pseudoleftist](pseudoleft.md) (a kind of [fascist](fascism.md)) that tries to [fight](fight_culture.md) (especially on the Internet) anyone opposing or even just slightly criticizing the mainstream pseudoleftist gospel such as the [feminism](feminism.md) and [LGBT](lgbt.md) propaganda. SJWs divide people rather than unite them, they operate on the basis of hate, revenge and mass hysteria and as we know, hate spawns more hate, they fuel a war mentality in society. They support hard [censorship](censorship.md) (forced [political correctness](political_correctness.md)) and bullying of their opposition, so called [cancelling](cancel_culture.md), and also such retardism as [sanism](sanism.md) and whatnot. [Wokeism](woke.md) is yet more extreme form of SJWery.
|
Social [justice](justice.md) [warrior](fight_culture.md) (SJW) is an especially active, [toxic](toxic.md) and aggressive kind of [pseudoleftist](pseudoleft.md) (a kind of [fascist](fascism.md)) that tries to [fight](fight_culture.md) (especially on the Internet) anyone opposing or even just slightly criticizing the mainstream pseudoleftist gospel such as the [feminism](feminism.md) and [LGBT](lgbt.md) propaganda. SJWs divide people rather than unite them, they operate on the basis of hate, revenge and mass hysteria and as we know, hate spawns more hate, they fuel a war mentality in society. They support hard [censorship](censorship.md) (forced [political correctness](political_correctness.md)) and bullying of their opposition, so called [cancelling](cancel_culture.md), and also such retardism as [sanism](sanism.md) and whatnot. [Wokeism](woke.md) is yet more extreme form of SJWery.
|
||||||
|
|
||||||
SJWs say the term is pejorative. We say it's not pejorative enough xD
|
SJWs say the term is pejorative. We say it's not pejorative enough xD
|
||||||
|
|
||||||
|
A sneaky tactic of an SJW is **masked hypocrisy**. As any good [marketing](marketing.md) guy he will proclaim some principle OUT LOUD IN BIG LETTERS, adding asterisks with exceptions that immediately break that principle. For example:
|
||||||
|
|
||||||
|
- "WE HAVE TO CREATE A CENSORSHIP RESISTANT INFORMATION NETWORK" (asterisk: "But we have to build in mechanisms to censor [pedophiles](pedophilia.md) and racists and other information we dislike.")
|
||||||
|
- "WE HAVE ZERO TOLERANCE OF CYBER BULLYING" (asterisk: "With the exception of bullying people we deem fair to be bullied.")
|
||||||
|
- "WE ARE PACIFIST REJECTING VIOLENCE" (asterisk: "With the exception of violence against people we deem good to use violence against.")
|
||||||
|
- "WE HAVE ZERO TOLERANCE OF [RACISM](racism.md)" (asterisk: "We don't count reverse racism as racism.")
|
||||||
|
- "WE SUPPORT [FREE SPEECH](free_speech.md) AND FREE INFORMATION SHARING" (asterisk: "Speech we dislike doesn't fall under free speech.")
|
||||||
|
- "WE SUPPORT TECHNOLOGICAL [MINIMALISM](minimalism.md)" (asterisk: "As long as it's written in [Rust](rust.md), [Python](python.md) and [JavaScript](js.md) with [encryption](encryption.md) and [virtual machines](vm.md) for [security](security.md).")
|
||||||
|
- "WE PROMOTE SCIENCE" (asterisk: "Science being defined as trusting the word of authorities we approve without questioning them.")
|
||||||
|
- "THIS [ENCYCLOPEDIA](wikipedia.md) CAN BE EDITED BY EVERYONE" (asterisk: "Except for 90% of population who are blocked for not conforming to our political style of writing.")
|
||||||
|
- etc.
|
|
@ -1,6 +1,6 @@
|
||||||
# Software Rendering
|
# Software Rendering
|
||||||
|
|
||||||
Sofware (SW) rendering refers to [rendering](rendering.md) [computer graphics](graphics.md) without the help of [graphics card](gpu.md) (GPU), i.e. computing images only with [CPU](cpu.md). This mostly means rendering [3D](3d.md) graphics but can also refer to other kinds of graphics such as drawing [fonts](font.md) or [video](video.md). Before GPUs were invented, all rendering was done in software, of course -- games such as [Quake](quake.md) or Thief were designed with SW rendering and only added optional GPU acceleration later. SW rendering for traditional 3D graphics is also called software [rasterization](rasterization.md), as rasterization is the basis of current real-time 3D graphics.
|
[Software](software.md) (SW) rendering refers to [rendering](rendering.md) [computer graphics](graphics.md) without the help of [graphics card](gpu.md) (GPU), i.e. computing images only with [CPU](cpu.md). This mostly means rendering [3D graphics](3d_rendering.md) but can also refer to other kinds of graphics such as drawing [fonts](font.md) or [video](video.md). Before GPUs were invented, all rendering was done in software, of course -- games such as [Quake](quake.md) or Thief were designed with SW rendering and only added optional GPU acceleration later. SW rendering for traditional 3D graphics is also called software [rasterization](rasterization.md), as rasterization is the basis of current real-time 3D graphics.
|
||||||
|
|
||||||
SW rendering has advantages and disadvantages, though from our point of view its advantages prevail (at least given only capitalist GPUs exist nowadays). Firstly it is **much slower** than GPU graphics -- GPUs are designed to perform graphics-specific operations very quickly and, more importantly, they can process many pixels (and other elements) in [parallel](parallelism.md), while a CPU has to compute pixels sequentially one by one and that in addition to all other computations it is otherwise performing. This causes a much lower [FPS](fps.md) in SW rendering. For this reasons SW rendering is also normally of **lower quality** (lower resolution, [nearest neighbour](nn.md) texture filtering, ...) to allow workable FPS. Nevertheless thanks to the ginormous speeds of today's CPUs simple fullscreen SW rendering can be pretty fast on PCs and achieve even above 60 FPS; on slower CPUs (typically [embedded](embedded.md)) SW rendering is usable normally at around 30 FPS if resolutions are kept small.
|
SW rendering has advantages and disadvantages, though from our point of view its advantages prevail (at least given only capitalist GPUs exist nowadays). Firstly it is **much slower** than GPU graphics -- GPUs are designed to perform graphics-specific operations very quickly and, more importantly, they can process many pixels (and other elements) in [parallel](parallelism.md), while a CPU has to compute pixels sequentially one by one and that in addition to all other computations it is otherwise performing. This causes a much lower [FPS](fps.md) in SW rendering. For this reasons SW rendering is also normally of **lower quality** (lower resolution, [nearest neighbour](nn.md) texture filtering, ...) to allow workable FPS. Nevertheless thanks to the ginormous speeds of today's CPUs simple fullscreen SW rendering can be pretty fast on PCs and achieve even above 60 FPS; on slower CPUs (typically [embedded](embedded.md)) SW rendering is usable normally at around 30 FPS if resolutions are kept small.
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ SW rendering may also utilize a much wider variety of rendering techniques than
|
||||||
|
|
||||||
A lot of software and rendering frameworks offer both options: accelerated rendering using GPU and SW rendering as a [fallback](fallback.md) (in case the first option is not possible). Sometimes there exists a rendering [API](api.md) that has both an accelerated and software implementation (e.g. [TinyGL](tinygl.md) for [OpenGL](opengl.md)).
|
A lot of software and rendering frameworks offer both options: accelerated rendering using GPU and SW rendering as a [fallback](fallback.md) (in case the first option is not possible). Sometimes there exists a rendering [API](api.md) that has both an accelerated and software implementation (e.g. [TinyGL](tinygl.md) for [OpenGL](opengl.md)).
|
||||||
|
|
||||||
For simpler and even somewhat more complex graphics **purely software rendering is mostly the best choice**. [LRS](lrs.md) suggests you prefer this kind of rendering for its simplicity and portability, at least as one possible option. On devices with lower resolution not many pixels need to be computed so SW rendering can actually be pretty fast despite low specs, and on "big" computers there is nowadays usually an extremely fast CPU available that can handle comfortable FPS at higher resolutions. There is a LRS software renderer you can use: [small3dlib](s3l.md).
|
For simpler and even somewhat more complex graphics **purely software rendering is mostly the best choice**. [LRS](lrs.md) suggests you prefer this kind of rendering for its simplicity and [portability](portability.md), at least as one possible option. On devices with lower resolution not many pixels need to be computed so SW rendering can actually be pretty fast despite low specs, and on "big" computers there is nowadays usually an extremely fast CPU available that can handle comfortable FPS at higher resolutions. There is a LRS software renderer you can use: [small3dlib](s3l.md).
|
||||||
|
|
||||||
SW renderers are also written for the purpose of verifying rendering hardware, i.e. as a [reference implementation](reference_implementation.md).
|
SW renderers are also written for the purpose of verifying rendering hardware, i.e. as a [reference implementation](reference_implementation.md).
|
||||||
|
|
||||||
|
@ -29,25 +29,27 @@ Possible tricks, cheats and [optimizations](optimization.md) you may utilize inc
|
||||||
- Using painter's algorithm (sorting triangles and drawing back to front) instead of z-buffer if you need to save a lot of RAM. But remember sorting doesn't [work](work.md) perfectly, glitches will inevitably appear, and you will probably gain overdraw penalty.
|
- Using painter's algorithm (sorting triangles and drawing back to front) instead of z-buffer if you need to save a lot of RAM. But remember sorting doesn't [work](work.md) perfectly, glitches will inevitably appear, and you will probably gain overdraw penalty.
|
||||||
- Ad previous point: you don't have to perform whole triangle sorting each frame if you need to save speed, it may be good enough to perform a constant continuous sorting by performing only a few iterations of some sorting algorithm per frame.
|
- Ad previous point: you don't have to perform whole triangle sorting each frame if you need to save speed, it may be good enough to perform a constant continuous sorting by performing only a few iterations of some sorting algorithm per frame.
|
||||||
- You may lower the quality of far-away objects in many ways, e.g. with [LOD](lod.md), only using affine texturing for them (as opposed to perspective-correct one) or even just using a constant color (average color of the texture), maybe even just drawing 2D sprites instead of 3D models etc. This may help a lot.
|
- You may lower the quality of far-away objects in many ways, e.g. with [LOD](lod.md), only using affine texturing for them (as opposed to perspective-correct one) or even just using a constant color (average color of the texture), maybe even just drawing 2D sprites instead of 3D models etc. This may help a lot.
|
||||||
|
- Try to reduce [overdraw](overdraw.md) (overwriting already rendered pixels with new closer ones) which wastes computation time. This can be achieved by good [culling](culling.md) of obscured objects or by using z-buffer along with front to back drawing.
|
||||||
- Generally use cheap [approximations](approximation.md) such as [Gouraud](gouraud.md) (per-vertex) [shading](shading.md) instead of [Phong](phong.md) (per-pixel), nearest neighbour texture sampling, only approximate perspective correction (every N pixels), simplified handling of near-plane culling (e.g. just pushing the vertices in front of camera instead of actually culling a triangle) etc.
|
- Generally use cheap [approximations](approximation.md) such as [Gouraud](gouraud.md) (per-vertex) [shading](shading.md) instead of [Phong](phong.md) (per-pixel), nearest neighbour texture sampling, only approximate perspective correction (every N pixels), simplified handling of near-plane culling (e.g. just pushing the vertices in front of camera instead of actually culling a triangle) etc.
|
||||||
- Use general [optimization](optimization.md) techniques: e.g. using power of two resolution for textures, fixed screen resolution that's known at compile time or inlining of your shader function will probably help performance.
|
- Use general [optimization](optimization.md) techniques: e.g. [precomputation](precomputation.md), using power of two resolution for textures, fixed screen resolution that's known at compile time or inlining of your shader function will probably help performance.
|
||||||
- TODO: MORE
|
- TODO: MORE
|
||||||
|
|
||||||
## Specific Renderers
|
## Specific Renderers
|
||||||
|
|
||||||
These are some notable software renderers:
|
These are some notable software renderers:
|
||||||
|
|
||||||
- **[Build engine](build_engine.md)**: While not a "true 3D", this was a very popular [proprietary](proprietary.md) portal-rendering engine for older games like Duke Nukem 3D or Blood.
|
- **[Build engine](build_engine.md)**: So called ["pseudo 3D"](pseudo_3d.md) or primitive 3D, this was a very popular [proprietary](proprietary.md) portal-rendering engine for older games like [Duke Nukem 3D](duke3d.md) or [Blood](blood.md).
|
||||||
- **[BRender](brender.md)**: Old commercial renderer used in games such as Carmageddon, Croc or Harry Potter 1. Later made [FOSS](foss.md).
|
- **[BRender](brender.md)**: Old commercial renderer used in games such as Carmageddon, Croc or Harry Potter 1. Later made [FOSS](foss.md).
|
||||||
- **[Dark Engine](dark_engine.md)**: Old proprietary game engine which includes a SW renderer, used mainly in the game Thief. The author writes about it at https://nothings.org/gamedev/thief_rendering.html.
|
- **[Dark Engine](dark_engine.md)**: Old proprietary game engine which includes a SW renderer, used mainly in the game Thief. The author writes about it at https://nothings.org/gamedev/thief_rendering.html.
|
||||||
- **[id Tech](id_tech.md)**: Multiple engines by [Id software](id.md) (later made [FOSS](foss.md)) used for games like [Quake](quake.md) included a software renderer. Quake's SW renderer was partially described in the *Michael Abrash's Graphics Programming Black Book*.
|
- **[id Tech](id_tech.md)**: Multiple engines by [Id software](id.md) (later made [FOSS](foss.md)) used for games like [Doom](doom.md), [Quake](quake.md) and its successors included a software renderer. Quake's SW renderer was partially described in the *Michael Abrash's Graphics Programming Black Book*, Doom's renderer is described e.g. in the book *Game Engine Black Book DOOM*.
|
||||||
- **[Irrlich](irrlicht.md)**: [FOSS](foss.md) game engine including a software renderer as one of its [backends](backend.md).
|
- **[Irrlich](irrlicht.md)**: [FOSS](foss.md) game engine including a software renderer as one of its [backends](backend.md).
|
||||||
- **[Mesa](mesa.md)**: [FOSS](foss.md) implementation of [OpenGL](opengl.md) that includes a software rasterizer.
|
- **[Mesa](mesa.md)**: [FOSS](foss.md) implementation of [OpenGL](opengl.md) that includes a software rasterizer.
|
||||||
- **[small3dlib](small3dlib.md)**: [LRS](lrs.md) [C](c.md) 3D rasterizer, very simple.
|
- **[small3dlib](small3dlib.md)**: [LRS](lrs.md) [C](c.md) 3D rasterizer, very simple.
|
||||||
- **SSRE**: The guy who wrote [LIL](lil.md) also made this renderer named Shitty Software Rendering Engine, accessible [here](http://runtimeterror.com/tech/ssre/).
|
- **[SSRE](ssre.md)**: The guy who wrote [LIL](lil.md) also made this renderer named Shitty Software Rendering Engine, accessible [here](http://runtimeterror.com/tech/ssre/).
|
||||||
- **[System Shock](system_shock.md) engine**: Old proprietary game engine.
|
- **[System Shock](system_shock.md) engine**: Old proprietary game engine.
|
||||||
- **[TinyGL](tinygl.md)**: Implements a subset of [OpenGL](opengl.md).
|
- **[TinyGL](tinygl.md)**: Implements a subset of [OpenGL](opengl.md).
|
||||||
- Many old [games](game.md) in the 90s implemented their own software renderers, so you can look there.
|
- Many old [games](game.md) in the 90s implemented their own software renderers, so you can look there.
|
||||||
|
- ...
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue