Der Moment wo einem klar wird, dass man einen besseren Pixel Font Renderer geschrieben hat wie in Photoshop implementiert ist

links: CPU lastiges Photoshop
rechts: Eigenerer GPU Renderer
beides hat eine Kantenglättung. Anti-Aliasing.
Jedoch hat Photoshop immer einen eigenen Algorythmus gehabt der sowas wie Mittelwert für alle Einsatzfälle sein sollte, aber eher dazu führt, dass dieser nirgends optimal gepasst hat.
Somit wirkt das Photoshop Bild (Vektor Font + Kontur) entweder unschärfer oder wahlweise ganz ohne Anti-Aliasing.
F: Zur Hölle Oneill, wie sieht so ein Code aus, der sowas macht?
A:
uniform vec4 agk_data;
uniform vec3 agk_bordercolor;
uniform sampler2D texture0;
varying mediump vec2 uvVarying;
varying mediump vec4 colorVarying;
void main()
{
vec4 VBuf = vec4(0); // create virtual buffer to write to
for(int i = 0; i < int(agk_data.y); i++) // do multisampler process for border
{
float r = radians( float( (i*2)*180/int(agk_data.y) ) );
vec2 offset = vec2( -cos(r) * 0.2, sin(r) ) * agk_data.x;
VBuf = VBuf + texture2D(texture0, uvVarying + offset);
VBuf.xyz = agk_bordercolor;
}
gl_FragColor = mix(VBuf, texture2D(texture0, uvVarying), texture2D(texture0, uvVarying).a); // mix stuff together
}
Alles anzeigen
Das ist ein GLSL Shader, der genau so an die Grafikkarte geschickt wird.
uniform sampler2D texture0;
ist hierbei die Textur, die in den Shader reinkommt. Der Pixelshader wird dann für jeden Pixel einmal berechnet, und zwar auf einer Fläche, die eine UV Koordinate haben muss, sowas wie der Texturausschnitt auf der Fläche (Face).
varying mediump vec2 uvVarying;
Somit wird Pixel für Pixel mit dem was in in der main{} Klammer ist, berechnet.
Die neue Farbe für jeden Pixel wird im RGBA format in
gespeichert. Das kann man dann direkt auf den Bildschirm klatschen, wenn man ein Window mit OpenGL Kontext erstellt hat.
Die Kunst beim Shader programmieren ist, einen Algorythmus zu finden der 1. das macht was du willst und 2. für jeden Pixel funktioniert.