GLSL | ShaderToy | Niezrozumiały błąd w działaniu prostego shader'a

0

Witam, w moim shaderze rysującym obraz z tablicy, pisanym na stronie shadertoy.com występuje niezrozumiały dla mnie błąd.

Kod:

//0-A ; 1-B ; 2-C ; 3-D ; 4-E ; 5-F ; 6-G ; 7-H ; 8-I ; 9-J

const int CHARS[1*25] = int[]( //Tablica jest poprawna.
/*A*/
    1,1,1,1,1 ,
    1,0,0,0,1 ,
    1,1,1,1,1 ,
    1,0,0,0,1 ,
    1,0,0,0,1
/*B*/
);

vec4 char(vec4 color, vec4 background, int char, vec2 position, float size, vec2 uv)
{
    ivec2 pixel = ivec2(ceil((uv.x-position.x)/size*5.0)-1.0, ceil((1.0-(uv.y-position.y))/size*5.0)-1.0);
    int index = char*25 + pixel.y*5 + pixel.x; //Indeks jest obliczany poprawnie.
    
    if(CHARS[index] == 1) //Zachodzi niewyjaśnialny błąd w działaniu.
    	return color;
    else
        return background;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord/iResolution.xy;
    
    vec4 color = vec4(vec3(0.0), 1.0);
	
    color = char(vec4(1.0), color, 0, vec2(0.0), 1.0, uv);
    
    fragColor = color;
}

Mimo, iż sprawdziłem, czy tablica i kalkulowanie indeksu jest poprawne (i jest), to niestety przy próbie rysowania obrazu z tablicy, kolor całego ekranu zależy tylko od indeksu 0 tej tablicy.
Prosiłbym o wyjaśnienie mi, co tutaj jest napisane źle i dlaczego mimo poprawnie obliczonego indeksu, tablica i tak ukazuje jedynie ten zerowy. Pozdrawiam.

0

@Rafbeam jaki błąd, copy paste Twojego kodu na shadertoy pokazuje dwa czarne prostokąty czyli tak jak narysowałeś w swojej tablicy - jak zmieniasz tablice to zmienia wszystko poprawnie.

Jak zmieniam kolor:

vec4 color = vec4(1.0, 0.0, 0.0, 1.0);

to wyświetla mi na czerwono. Napisz co chcesz osiągnąć i jaki jest problem

EDIT: zakładam, że nie rozumiesz jak działają kolory.

vec4 to po kolei RGBA, vec4(1.,0.,0., 1.0) to R=1 G=0, B=0 czyli czerwony. vec4(1.0) to R=1, G=1, B=1 czyli biały. Alpha chyba jest ignorowana na shadertoyu z tego co pamiętam

0

Niestety w przeglądarce Google Chrome nie działa to jak powinno. Podobnie w Microsoft Edge występują błędy kompilacji innych shaderów.



Wiem jak działają kolory RGBA. ;)

1
vec4 char(vec4 color, vec4 background, int char, vec2 position, float size, vec2 uv)

Z tego co patrzę (a patrzę w papierową specyfikację GLSL 1.2) char rzeczywiście nie ma na liście keywordów, ale i tak nie używałbym tego jako nazwy funkcji.

   vec4 color = vec4(vec3(0.0), 1.0);
   color = char(vec4(1.0), color, 0, vec2(0.0), 1.0, uv);
   fragColor = color;

Ten kod jest mało czytelny.

	const vec4 fgColor = vec4(1.0, 1.0, 1.0, 1.0);
	const vec4 bgColor = vec4(0.0, 0.0, 0.0, 1.0);
	fragColor = char(fgColor, bgColor, 0, vec2(0.0), 1.0, uv);

Co do „nie działania”: sprawdziłem na kilku przeglądarkach:

• Pale Moon – nie działa (woła o GLSL 3.0)
• Firefox – działa
• Vivaldi – działa
• Internet Explorer – nie działa („niezrozumiały” błąd)

Podejrzewam że błąd na MSIE ma tę samą przyczynę co pod Pale Moon: składnia wymagająca GLSL 3.0 a brak supportu tej wersji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1