Dithering

This commit is contained in:
nefrace 2025-05-14 23:26:47 +03:00
parent e5cbc4ca5f
commit 120a70cf42
5 changed files with 36 additions and 14 deletions

BIN
assets/gfx/bluem0ld-1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

View File

@ -15,13 +15,25 @@ uniform vec4 colDiffuse;
out vec4 finalColor; out vec4 finalColor;
const int bayer16[16] = int[16](0, 8, 2, 10,
12, 4, 14, 6,
3, 11, 1, 9,
15, 7, 13, 5);
void main() { void main() {
vec4 texelColor = texture(texture0, fragTexCoord); vec4 texelColor = texture(texture0, fragTexCoord);
float grey = 0.21 * texelColor.r + 0.71 * texelColor.g + 0.07 * texelColor.b ; float grey = 0.21 * texelColor.r + 0.71 * texelColor.g + 0.07 * texelColor.b ;
int col = int(mod(gl_FragCoord.x, 4));
int row = int(mod(gl_FragCoord.y, 4));
float threshold = float(bayer16[col + 4 * row]) / 16.0 - 0.5;
grey = clamp(grey + threshold * 0.04 + 0.15 , 0.01, 0.99);
vec2 paluv = vec2(grey, 0.5); vec2 paluv = vec2(grey, 0.5);
vec4 paletteValue = texture(texture1, paluv); vec4 paletteValue = texture(texture1, paluv);
finalColor.a = 1.0; finalColor.a = 1.0;
// finalColor.rgb = vec3(floor(grey * POSTERIZE) / POSTERIZE );
// finalColor.rgb = floor(texelColor.rgb * POSTERIZE) / POSTERIZE; // finalColor.rgb = floor(texelColor.rgb * POSTERIZE) / POSTERIZE;
finalColor.rgb = paletteValue.rgb; finalColor.rgb = paletteValue.rgb;

View File

@ -51,10 +51,11 @@ main :: proc() {
w, h := rl.GetScreenWidth(), rl.GetScreenHeight() w, h := rl.GetScreenWidth(), rl.GetScreenHeight()
pixelize: i32 = 2 pixelize: i32 = 3
target := rl.LoadRenderTexture(w / pixelize, h / pixelize) target := rl.LoadRenderTexture(w / pixelize, h / pixelize)
posttarget := rl.LoadRenderTexture(w / pixelize, h / pixelize)
palette := rl.LoadTexture("assets/gfx/blood-crow-1x.png") palette := rl.LoadTexture("assets/gfx/bluem0ld-1x.png")
rl.SetTextureFilter(palette, .POINT) rl.SetTextureFilter(palette, .POINT)
@ -145,6 +146,8 @@ main :: proc() {
w, h = rl.GetScreenWidth(), rl.GetScreenHeight() w, h = rl.GetScreenWidth(), rl.GetScreenHeight()
rl.UnloadRenderTexture(target) rl.UnloadRenderTexture(target)
target = rl.LoadRenderTexture(w / pixelize, h / pixelize) target = rl.LoadRenderTexture(w / pixelize, h / pixelize)
rl.UnloadRenderTexture(posttarget)
posttarget = rl.LoadRenderTexture(w / pixelize, h / pixelize)
} }
rl.UpdateCamera(&cam, .FIRST_PERSON) rl.UpdateCamera(&cam, .FIRST_PERSON)
delta := rl.GetFrameTime() delta := rl.GetFrameTime()
@ -197,27 +200,34 @@ main :: proc() {
rl.EndShaderMode() rl.EndShaderMode()
rl.EndMode3D() rl.EndMode3D()
rl.EndTextureMode() rl.EndTextureMode()
rl.BeginDrawing() // rl.BeginDrawing()
rl.BeginTextureMode(posttarget)
rl.BeginShaderMode(posterizer) rl.BeginShaderMode(posterizer)
rl.SetShaderValueTexture(posterizer, poster_palette, palette) rl.SetShaderValueTexture(posterizer, poster_palette, palette)
rl.DrawTexturePro(
target.texture,
rl.Rectangle{0, f32(h / pixelize), f32(w / pixelize), -f32(h / pixelize)},
{0, 0, f32(w), f32(h)},
{},
0,
rl.WHITE,
)
// rl.DrawTexturePro( // rl.DrawTexturePro(
// target.depth, // target.texture,
// rl.Rectangle{0, f32(h / pixelize), f32(w / pixelize), -f32(h / pixelize)}, // rl.Rectangle{0, f32(h / pixelize), f32(w / pixelize), -f32(h / pixelize)},
// {0, 0, f32(w), f32(h)}, // {0, 0, f32(w), f32(h)},
// {}, // {},
// 0, // 0,
// rl.WHITE, // rl.WHITE,
// ) // )
rl.DrawTexture(target.texture, 0, 0, rl.WHITE)
rl.EndShaderMode() rl.EndShaderMode()
// rl.DrawTexture(palette, 0, 0, rl.WHITE) rl.EndTextureMode()
rl.BeginDrawing()
// rl.BeginTextureMode(posttarget)
// rl.BeginShaderMode(posterizer)
// rl.SetShaderValueTexture(posterizer, poster_palette, palette)
rl.DrawTexturePro(
posttarget.texture,
rl.Rectangle{0, 0, f32(w / pixelize), f32(h / pixelize)},
{0, 0, f32(w), f32(h)},
{},
0,
rl.WHITE,
)
rl.EndDrawing() rl.EndDrawing()
} }
} }