Autor Wątek: GLSL a glActiveTexture  (Przeczytany 1866 razy)

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 18, 2009, 23:07:17
Moje pytanie jest pewnie bardzo lamerskie ale dopiero uczę sie GLSL i nie rozumiem pewnej kwestii, otoz:

Mam shader odwzorowania srodowiskowego bardzo prosty z oswietleniem oto kod:

vert:

varying vec3  Normal;
varying vec3  EyeDir;
uniform vec3  LightPos;

varying vec3 L;
varying vec3 N;
varying vec3 P;

void main()
{
   P = vec3(gl_ModelViewMatrix * gl_Vertex);
     L = normalize(-gl_LightSource[1].position.xyz-P);
   N = normalize(gl_NormalMatrix * -gl_Normal);

   gl_TexCoord[0] = gl_MultiTexCoord0;

       gl_Position    = ftransform();
       Normal         = normalize(gl_NormalMatrix * gl_Normal);
       vec4 pos       = gl_ModelViewMatrix * gl_Vertex;
       EyeDir         = pos.xyz;
}

frag:

const vec3 Xunitvec = vec3(1.0, 0.0, 0.0);
const vec3 Yunitvec = vec3(0.0, 1.0, 0.0);

uniform float MixRatio;

uniform sampler2D EnvMap;
uniform sampler2D myTexture;

varying vec3  Normal;
varying vec3  EyeDir;

varying vec3 L;
varying vec3 N;
varying vec3 P;

void main()
{
   
   vec3 E = normalize(-P);
   vec3 R = normalize(-reflect(L,N));
 
     vec4 Iamb =  gl_FrontLightProduct[1].ambient * 0.1;
     vec4 Idiff = gl_FrontLightProduct[1].diffuse * max(dot(N,L), -0.65);
   vec4 Ispec = gl_FrontLightProduct[1].specular * pow( max(dot(R,E), 0.0) , gl_FrontMaterial.shininess);

   vec4 Mdiff = Idiff * 0.10;

   vec3 reflectDir = reflect(EyeDir, Normal);

   vec2 index;

       index.y = dot(normalize(reflectDir), Yunitvec);
       reflectDir.y = 0.0;
       index.x = dot(normalize(reflectDir), Xunitvec) * 0.5;
       
       if (reflectDir.z >= 0.0)
           index = (index + 1.0) * 0.5;
       else
       {
           index.t = (index.t + 1.0) * 0.5;
           index.s = (-index.s) * 0.5 + 1.0;
       }
   

       vec3 envColor = vec3(texture2D(EnvMap, index));

       vec3 base = vec3(texture2D(myTexture, gl_TexCoord[0]));
       envColor = mix(base, envColor, MixRatio);

       gl_FragColor = vec4(envColor, 1.0) + Mdiff + Ispec + Iamb;
}

działa dobrze i wszystko jest ok ale moj problem polega na podawaniu textury do shadera dokladnie "EnvMap"

robie to w nastepujacy sposob:

glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, evTex);
                  
int location = Test.GetUniLoc("EnvMap");
                  
if(location == -1){
   break;
}
else
{
   glUniform1iARB(location,2);   
}
                  
glActiveTexture(GL_TEXTURE0);

i teraz moje pytanie co dokladnie mam wstawiac za ta liczbe 2 wiem ze ma to byc poniekad nr textury ale dalczego u mnie to jest akurat 2 (doszedlem experymentalnie do tego)

zmienna textury evTex jest globalna.

do czego dokladnie sluzy glActiveTexture() i jak mam to na przyszłosc obliczac z gory dziekuje za pomoc.


Offline Mr. Spam

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

Offline Dab

  • Moderator
    • blog

# Styczeń 18, 2009, 23:29:52
Cytuj
glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, evTex);
                 
int location = Test.GetUniLoc("EnvMap");
                 
if(location == -1){
   break;
}
else
{
   glUniform1iARB(location,2);  
}
       
(tak na oko, bo nigdy w GLSL nie kodziłem - polecam Cg ;))
« Ostatnia zmiana: Styczeń 18, 2009, 23:35:19 wysłana przez Dab »

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 18, 2009, 23:32:50
tak o te "2" chodzi jak to mam obliczac bo czuje ze na innym komputerze pojawi sie inna textura albo wogole nie zadziala :/

Offline voytech

  • Użytkownik

# Styczeń 18, 2009, 23:38:17
glActiveTexture(GL_TEXTURE0 + 2);
powyższe +2 oznacza, że uaktywniasz trzecią jednostkę teksturującą, dlatego do uniforma EnvMap również musisz podać 2.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 18, 2009, 23:40:00
tzn w jaki sposob? (przez rejestr textury?)

chodzi mi raczej o fakt tego ze nie mam pewnosci ze zaladuje sie jako 3 jednostka bo moze byc tak ze akurat ta textura zaladuje sie jako 4 (tak mi sie przynajmniej wydaje bo i takie rzeczy mi sie dzialy)
« Ostatnia zmiana: Styczeń 18, 2009, 23:44:42 wysłana przez .:NOXY:. »

Offline _OskaR

  • Użytkownik

# Styczeń 18, 2009, 23:51:51
A nie chodzi o GL_TEXTURE0, GL_TEXTURE1 itd.?

(tak na oko, bo nigdy w GLSL nie kodziłem - polecam Cg ;))

Gdyby jeszcze wszystkie grafy miały znaczek NV :D

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 19, 2009, 00:03:56
No o to chodzi =p tylko jak ja mam wiedziec ze akurat moja textura laduje sie jako GLTEXTURE0 + 2 = GLTEXTURE2

Offline voytech

  • Użytkownik

# Styczeń 19, 2009, 00:04:27
A nie chodzi o GL_TEXTURE0, GL_TEXTURE1 itd.?

GL_TEXTURE1 == (GL_TEXTURE0+1), itd.


NOXY: przecież to ty kontrolujesz, która jednostka powinna być wybrana i jaką teksture ma mieć zbindowaną

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 19, 2009, 00:15:55
no wlasnie o dziwo nie do konca bo jak dam tam GLTEXTURE1 to sie sypie =p oglnie przyjmuje ze moge uzyc dowlnej powyzej GLTEXTURE0 + 1

moje pytanie zachacza bardziej o sformułowanie skoro mam tam 2 to czy to na bank jest stabilne i moge to tak zostawic i czy jezeli wywolam ten shader gdzies indziej to czy dalej tam ma pozostac 2 czy juz np 3?

Offline Charibo

  • Redaktor

# Styczeń 19, 2009, 00:23:29
(tak na oko, bo nigdy w GLSL nie kodziłem - polecam Cg ;))
Gdyby jeszcze wszystkie grafy miały znaczek NV :D
Co ma NVIDIA do Cg? Przecież to tylko język, a runtimes chodzą na każdym sprzęcie. " :D ".

Offline voytech

  • Użytkownik

# Styczeń 19, 2009, 00:33:36
no wlasnie o dziwo nie do konca bo jak dam tam GLTEXTURE1 to sie sypie =p oglnie przyjmuje ze moge uzyc dowlnej powyzej GLTEXTURE0 + 1

moje pytanie zachacza bardziej o sformułowanie skoro mam tam 2 to czy to na bank jest stabilne i moge to tak zostawic i czy jezeli wywolam ten shader gdzies indziej to czy dalej tam ma pozostac 2 czy juz np 3?

Jak dajesz GL_TEXTURE0+1 to musisz do uniforma również przekazać 1  - glUniform1iARB(location,1), o ile nie ma tam innej tekstury

Offline Dab

  • Moderator
    • blog

# Styczeń 19, 2009, 00:43:36
(tak na oko, bo nigdy w GLSL nie kodziłem - polecam Cg ;))
Gdyby jeszcze wszystkie grafy miały znaczek NV :D
Co ma NVIDIA do Cg? Przecież to tylko język, a runtimes chodzą na każdym sprzęcie. " :D ".
Dokładnie, dla kart graficznopodobnych Cg kompilowane jest do profili ARB. ;) (me też być "skompilowane" do GLSL)