Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Mai 20, 2024 12:39

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem bei zwei Texturen
BeitragVerfasst: Fr Apr 11, 2008 19:50 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 12, 2008 10:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 12, 2008 10:14 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 12, 2008 10:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 12, 2008 10:42 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Dann müsste es doch rein theoretisch, weil gl_TexCoord 0 und 1 gleich sein müssten, auch mit 1 gehen oder nicht ?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 12, 2008 11:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 12, 2008 16:20 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
danke, daran hats gelegen ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]