DGL
https://delphigl.com/forum/

Problem bei zwei Texturen
https://delphigl.com/forum/viewtopic.php?f=20&t=7413
Seite 1 von 1

Autor:  Seth [ Fr Apr 11, 2008 19:50 ]
Betreff des Beitrags:  Problem bei zwei Texturen

Hi,
Habe gerade angefangen, mich in das Thema Shader einzuarbeiten und wollte ein einfaches Normalmapping implementieren. (Ich weiß nicht, ob mein Ansatz überhaupt richtig ist, aber das ist erstmal unwichtig)
Nun habe ich das Problem, dass meine Textur (nicht die Normalmap) nicht angezeigt wird. Wenn ich jedoch Texture0 statt Texture1 benutze (im Fragmentshader) wird die Normalmap (korrekterweise) statt der anderen Textur platziert.

Hier mein Programmcode:
Code:
  1.   // Shader
  2.   glUseProgramObjectARB(programobject);
  3.   // Textures
  4.   glEnable(GL_TEXTURE_2D);
  5.   glActiveTexture(GL_TEXTURE0);
  6.   glBindTexture(GL_TEXTURE_2D, normalmap);
  7.   glActiveTexture(GL_TEXTURE1);
  8.   glBindTexture(GL_TEXTURE_2D, wood);
  9.   // Shader parameters
  10.   glUniform1iARB(glGetUniformLocationARB(fragmentshaderobject, 'Texture0'), 0);
  11.   glUniform1iARB(glGetUniformLocationARB(fragmentshaderobject, 'Texture1'), 1);
  12.   // Draw
  13.   glPushmatrix;
  14.     glTranslatef(-2, 0, 0);
  15.     DrawCube;
  16.   glPopmatrix;

Mein Vertexshader:
Code:
  1. varying vec3 normal;
  2. varying vec3 v;
  3. varying vec3 lightvec;
  4.  
  5. void main(void)
  6. {
  7.   vec4 Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   gl_Position = Position;
  9.   normal = normalize(gl_NormalMatrix * gl_Normal);
  10.   v = vec3(Position);
  11.   lightvec = normalize(vec3(gl_LightSource[0].position) - v);
  12.   gl_TexCoord[0] = gl_MultiTexCoord0;
  13.   gl_TexCoord[1] = gl_MultiTexCoord1;
  14. }

und mein Fragmentshader (Light etc. erst einmal auskommentiert):
Code:
  1. uniform sampler2D Texture0;
  2. uniform sampler2D Texture1;
  3.  
  4. varying vec3 normal;
  5. varying vec3 v;
  6. varying vec3 lightvec;
  7.  
  8. void main(void)
  9. {  
  10.   vec3 Eye = normalize(-v);
  11.   // Normalmapping (stimmt so noch nicht)
  12. //  vec4 normalmap = texture2D(Texture0, vec2(gl_TexCoord[0]));
  13. //  normal = normalize(vec3(normalmap));
  14.   vec3 Reflected = normalize(reflect(-lightvec, normal));  
  15.   vec4 LightAmbient = gl_LightSource[0].ambient;
  16.   vec4 LightDiffuse = gl_LightSource[0].diffuse * max(dot(normal, lightvec), 0.0);
  17.   vec4 LightSpecular = gl_LightSource[0].specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
  18. //  gl_FragColor = texture2D(Texture1, vec2(gl_TexCoord[1])) * (gl_FrontLightModelProduct.sceneColor + LightAmbient + LightDiffuse + LightSpecular);
  19.   gl_FragColor = texture2D(Texture1, vec2(gl_TexCoord[1]));
  20. }


mfg

Autor:  Lord Horazont [ Sa Apr 12, 2008 10:10 ]
Betreff des Beitrags: 

Wenn ich mich recht erinnere musst du glGetUniformLocationARB das ProgramObject, nicht das FragmentShaderObject übergeben. Das FragmentShaderObject und das VertexShaderObject kannst du eigentlich nachdem du sie an das ProgramObject gebunden hast, freigeben.

Gruß Lord Horazont

Autor:  Seth [ Sa Apr 12, 2008 10:14 ]
Betreff des Beitrags: 

Achso, ich dachte das Programm muss wissen, welcher Shader das nun bekommen soll ;)
Ah, wenn ich jetzt gl_TexCoord[0] benutze gehts. Nur hab ich noch net ganz verstanden warum.
Dieses Konstrukt ist mir irgendwie suspekt:
Code:
  1. texture2D(Texture1, vec2(gl_TexCoord[0]));

Soweit ich weiß ist das ein Vektor aus 4 Komponenten, sprich RGBA, richtig ? was hat das TexCoord zu bedeuten ?

mfg

Autor:  Lord Horazont [ Sa Apr 12, 2008 10:18 ]
Betreff des Beitrags: 

gl_TexCoord ist ein Array, in dem die Texturkoordinaten, die du vom Programm aus mit glTexCoord übergibst drin stehen. Das Array enthält für jede Texturunit einen Eintrag. Also ist gl_TexCoord[0] die Texturkoordinate für die 1. Texturunit, gl_TexCoord[1] für die 2. und so weiter. Der Inhalt ist immer ein vec4, egal welche Funktion du verwendet hast, um die Texturkoordinaten zu übergeben (glTexCoord2f oder glTexCoord4f)

texture2D gibt dir den RGBA-Wert der Textur an der gegebenen Koordinate (inkl. Sampling, wie z.B. Linear) als vec4 zurück. Als ersten Parameter erwartet es den sampler2D, den du aus dem Uniform gewinnst und der zweite Parameter eben die Koordinate.

Gruß Lord Horazont

Autor:  Seth [ Sa Apr 12, 2008 10:42 ]
Betreff des Beitrags: 

Dann müsste es doch rein theoretisch, weil gl_TexCoord 0 und 1 gleich sein müssten, auch mit 1 gehen oder nicht ?

mfg

Autor:  Lord Horazont [ Sa Apr 12, 2008 11:20 ]
Betreff des Beitrags: 

Das kommt drauf an. Wenn du die Texturkoordinaten explizit auch für die GL_TEXTURE1-Unit überigibst (also mit glMultiTexCoord), dann ja. glTexCoord übergibt aber nur an die 1. Texturunit.

Gruß Lord Horazont

Autor:  Seth [ Sa Apr 12, 2008 16:20 ]
Betreff des Beitrags: 

danke, daran hats gelegen ;)

mfg

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/