Autor Wątek: Modyfikowanie tekstury za pomoca shadera.  (Przeczytany 6155 razy)

Offline kuman

  • Użytkownik

# Lipiec 15, 2014, 16:05:41
Witam, chcialbym napisac program w ktorym proboje modyfikowac teksture za pomoca programu shadera.

Najpierw tworze teksture z pliku jpg, pozniej standardowo wyswietlam teksture

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texId);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glBegin(GL_QUADS);
 glTexCoord2f(x,y);glVertex3f(x,y);
...
glEnd();
glPopMatrix();
glDisable(GL_TEXTURE_2D);

nastepnie kompiluje i uruchamiam shadery

vertex shader:

#version 330
in vec4 vVertex;
in vec2 vTexCoord;
smooth out vec2 vVaryingTexCoords;

void main()
{
  vVaryingTexCoords = vTexCoords;
  glPosition = vVertex;
}

fragment shader:

uniform sampler2D texUnit;
out vec4 vFragColor;
smooth in vec2 vVaryingTexCoords;

void main()
{
  vFragColor = texture(texUnit,vVaryingTexCoords.st);
}

a na koniec robie zmienna uniform powiazana z tekstura

glBindTexture(GL_TEXTURE_2D,texId);
GLint iTextureUniform = glGetUniformLoaction(shader_program,"texUnit");
glUniform1i(iTextureUniform,0);

Tekstura sie wyswietala ale jak zermuje fragment shader albo powiaze zmiiennej "texUnit" z tesktura tez sie wyswietli
, a chcialbym docelowo modyfikowac obraz wlasnie w fragment shaderze.



Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline MrKaktus

  • Użytkownik

# Lipiec 15, 2014, 16:10:55
Shadery nie mogą modyfikować tekstur.
Naucz się pisać polskie słowa zanim zadasz pytanie bo totalnie nie rozumiem o czym piszesz.

Offline kuman

  • Użytkownik

# Lipiec 15, 2014, 17:00:59
Chcialbym wyswietlic teksture a nastepnie modyfikowac obraz, ktory powstanie po wyswietleniu tekstury, ten efekt chcialbym uzyskac za pomoca fragment shadera. Teraz jak modyfikuje kod fragment shadera to obraz sie nie zmienia. Czy moglby mi ktos podpowiedziec co robie zle ?

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Lipiec 15, 2014, 17:07:07
po pierwsze: powiedz co za efekt chcesz uzyskac? od tego zalezy, co robisz zle.

Offline kuman

  • Użytkownik

# Lipiec 15, 2014, 17:16:05
Mam teksture zrobiona z png, chcialbym modyfikowac wspolczynnik przezroczystosci. Ale jak napisze w fragment shaderze:

vFragColor = texture(texUnit,vVaryingTexCoords.st);
vFragColor.a = 0.5;

Obraz pozostaje bez zmian.

Jak usune fragment vFragColor = texture(texUnity,vVaryingTexCoord.st) to tekstura nie powinna sie wyswietlic? Nawet jak zostawie fragment shader pusty to i tak wyswietli mi teksture.

Offline kuman

  • Użytkownik

# Lipiec 15, 2014, 17:32:08
Problem jest taki ze fragmnet shader zwierajacy kod:

void main()
{
  vFragColor = texture(texUnit,vVaryingTexCoords.st);
}

daje taki sam efekt co fragment shader

void main()
{
 
}


Offline _OskaR

  • Użytkownik

# Lipiec 15, 2014, 18:16:23
Nie powinieneś czasem ustawić sobie alpha blendingu?
Z tym teksturowaniem dla pustego maina to trochę dziwne - może zacznij od wyplucia jakiegoś stałego koloru, a potem np. pomnóż kolor przez teksturę.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Lipiec 15, 2014, 20:32:45
Umm... glEnable(GL_BLEND); ?

Offline karol57

  • Użytkownik

  • +1
# Lipiec 15, 2014, 22:57:46
Czegoś nie rozumiem. Najpierw ładujesz teksturę i ją wyświetlasz, a potem dopiero kompilujesz shadery? Shadery powinieneś mieć gotowe przed wyświetlaniem. Uniform też obowiązkowo przed wyświetleniem.

Poza tym mieszanie fixed pipeline i shaderów nie jest najlepszym pomysłem (standard się w ogóle jakoś odwołuje do tego?).

P.S. Następnym razem na forum opakuj kod w [​code​][​/code​]
« Ostatnia zmiana: Lipiec 15, 2014, 23:05:29 wysłana przez karol57 »

Offline _OskaR

  • Użytkownik

# Lipiec 16, 2014, 00:54:40
Poza tym mieszanie fixed pipeline i shaderów nie jest najlepszym pomysłem (standard się w ogóle jakoś odwołuje do tego?).
Tak na marginesie - shadery w ogóle się zbudowały jak należy?

Offline kuman

  • Użytkownik

# Lipiec 17, 2014, 14:33:43
Witam.

Dodalem glBend, sprawdzlem i bez shaderow wyswietla mi teksture parawidlowo.
Shadery kompiluja sie prawidlowo, do kodu shadera dodalem atrybuty vVertex i vTexCoords, tak jak w przykladzie z ksiazki "Opengl Ksiega eksperta", ladowanie i kompilacje shaderow tez skopiowalem z przykladow zamieszczonych w necie do tej ksiazki.

Laduje shadery przed wyswietlaniem, a funkcja ktora chce wyrenderowac teksure wyglada tak:

while
{
  glUseProgram(programId);
  glBindTexture(GL_TEXTURE_2D,texId);
  Gint iTextureUniform = glGetUniformLocation(program,"texUnit");
  glUniform1i(iTextureUniform,0);
  glFlush();
  allegro_gl_flip();
}

Ale po tych zmianach dalej mam czarny ekran.



Offline MrKaktus

  • Użytkownik

# Lipiec 17, 2014, 17:29:58
nigdzie nie wywolujesz polecenia DRAW, nie wysylasz zadnej GEOMETRII ktora ma byc oteksturowana wynikiem obliczen z Fragment Shadera.

Offline karol57

  • Użytkownik

# Lipiec 17, 2014, 17:39:50
Masz czarny ekran, bo nic nie wyświetlasz.

Podłączasz shader, teksturę, ustawiasz uniform - w miarę ok. Zapomniałeś jeszcze podłączyć VAO (glBindVertexArray) i wyświetlić trójkąty (glDrawArrays).

// EDIT: Tak to jest jak się 15 min posta pisze...

Offline kuman

  • Użytkownik

# Lipiec 17, 2014, 18:48:22
Przekopiowalem wszystkie funcje z przykladow z Ksiegi eksperta i teraz dziala. Tylko ze tam nie ma juz wyswietlania prymitywow za pomoaca glBegin i glEnd i sa funckje do tworzenia tekstur, ja uzywalem do tworzenia tesktur funkcji z allegro_gl.

Czy jak utworze teksture za pomoca allegro_gl a nastepnie wykonam glBindTexture, to bede mogl zmienic jej parametry za pomoca glTexParameter ?

Offline Xirdus

  • Redaktor

# Lipiec 17, 2014, 19:45:28
Czy jak utworze teksture za pomoca allegro_gl a nastepnie wykonam glBindTexture, to bede mogl zmienic jej parametry za pomoca glTexParameter ?
Zakładając że allegro nie robi nic dziwnego, owszem.