mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-01-18 17:19:50 +00:00
Use texelFetch instead of texture for indexed mode shaders
Fixes various weird issues when palettes have empty slots, and removes unnecessary calculations.
This commit is contained in:
parent
d580523c6e
commit
1dcb696c35
|
@ -14,7 +14,7 @@ vec4 swap_color(vec4 color) {
|
||||||
|
|
||||||
int n_of_colors = textureSize(palette_texture, 0).x;
|
int n_of_colors = textureSize(palette_texture, 0).x;
|
||||||
int color_index = find_index(color, n_of_colors, palette_texture);
|
int color_index = find_index(color, n_of_colors, palette_texture);
|
||||||
return texture(palette_texture, vec2(float(color_index) / float(n_of_colors), 0.0));
|
return texelFetch(palette_texture, ivec2(color_index, 0), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fragment() {
|
void fragment() {
|
||||||
|
|
|
@ -2,8 +2,7 @@ int find_index(vec4 color, int n_of_colors, sampler2D palette_texture) {
|
||||||
int color_index = 0;
|
int color_index = 0;
|
||||||
float smaller_distance = distance(color, texture(palette_texture, vec2(0.0)));
|
float smaller_distance = distance(color, texture(palette_texture, vec2(0.0)));
|
||||||
for (int i = 0; i <= n_of_colors; i++) {
|
for (int i = 0; i <= n_of_colors; i++) {
|
||||||
vec2 uv = vec2(float(i) / float(n_of_colors), 0.0);
|
vec4 palette_color = texelFetch(palette_texture, ivec2(i, 0), 0);
|
||||||
vec4 palette_color = texture(palette_texture, uv);
|
|
||||||
float dist = distance(color, palette_color);
|
float dist = distance(color, palette_color);
|
||||||
if (dist < smaller_distance) {
|
if (dist < smaller_distance) {
|
||||||
smaller_distance = dist;
|
smaller_distance = dist;
|
||||||
|
|
|
@ -7,16 +7,16 @@ uniform sampler2D palette_texture : filter_nearest;
|
||||||
uniform sampler2D indices_texture : filter_nearest;
|
uniform sampler2D indices_texture : filter_nearest;
|
||||||
|
|
||||||
void fragment() {
|
void fragment() {
|
||||||
float index = texture(indices_texture, UV).r;
|
float index = texture(indices_texture, UV).r * 255.0;
|
||||||
if (index <= EPSILON) { // If index is zero, make it transparent
|
if (index <= EPSILON) { // If index is zero, make it transparent
|
||||||
COLOR = vec4(0.0);
|
COLOR = vec4(0.0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
float n_of_colors = float(textureSize(palette_texture, 0).x);
|
float n_of_colors = float(textureSize(palette_texture, 0).x);
|
||||||
index -= 1.0 / 255.0;
|
index -= 1.0;
|
||||||
float index_normalized = ((index * 255.0)) / n_of_colors;
|
float index_normalized = index / n_of_colors;
|
||||||
if (index_normalized + EPSILON < 1.0) {
|
if (index < n_of_colors) {
|
||||||
COLOR = texture(palette_texture, vec2(index_normalized + EPSILON, 0.0));
|
COLOR = texelFetch(palette_texture, ivec2(int(index), 0), 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// If index is bigger than the size of the palette, make it transparent.
|
// If index is bigger than the size of the palette, make it transparent.
|
||||||
|
|
|
@ -8,7 +8,7 @@ uniform sampler2D palette_texture : filter_nearest;
|
||||||
|
|
||||||
void fragment() {
|
void fragment() {
|
||||||
vec4 color = texture(rgb_texture, UV);
|
vec4 color = texture(rgb_texture, UV);
|
||||||
if (color.a <= 0.01) {
|
if (color.a <= 0.0001) {
|
||||||
COLOR.r = 0.0;
|
COLOR.r = 0.0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in a new issue