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

Aktuelle Zeit: Fr Jul 18, 2025 19:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Shader - Einsteigerfrage
BeitragVerfasst: Fr Jan 11, 2008 16:12 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Hi.
Ich will mir die Nutzung von Shadern aneignen, daher fang ich erstmal klein an :-)
Es tut mir echt Leid, dass ich ne so einfache Frage stellen muss, aber was stimmt an diesem Shader nicht?
Am Anfang ist das Viereck, welches ich als Testobjekt rendere, ganz kurz da und dann ist es weg und kommt nicht wieder... :-(

Hier mal der Shader, ist nur ein Vertexshader.

Code:
  1.  
  2. void main(void)
  3. {
  4.    vec4 a = gl_Vertex;
  5.    a.x = a.x * 0.5;
  6.    a.y = a.y * 0.5;
  7.    a.z = a.z;
  8.  
  9.    gl_Position = gl_ModelViewProjectionMatrix * a;
  10. }
  11.  


Initialisieren tu ich ihn hoffentlich richtig:
Code:
  1.  
  2. sl := TStringlist.Create;
  3. sl.LoadFromFile('vtxsh.vert');
  4. s := sl.Text;
  5. l := length(sl.Text);
  6.  
  7. ogl.ProgramObject := glCreateProgramObjectARB;
  8. ogl.VertexShaderObject   := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  9.  
  10. glShaderSourceARB(ogl.VertexShaderObject, 1, @s, @l);
  11. glCompileShaderARB(ogl.VertexShaderObject);
  12.  
  13. glAttachObjectARB(ogl.ProgramObject, ogl.VertexShaderObject);
  14.  
  15. glDeleteObjectARB(ogl.VertexShaderObject);
  16.  
  17. glLinkProgramARB(ogl.ProgramObject);
  18.  
  19. glUseProgramObjectARB(ogl.ProgramObject);
  20. FreeAndNil(sl);
  21.  


Rendern tu ich ein einfaches weißes Quadrat. ich bin mir sicher, dass ihr mir helfen könnt!

Danke!!!! :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 11, 2008 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Mir ist nicht ganz klar, was die Multiplikationen da sollen... Ist das einfach nur ein Versuch, eine Transformation einzubauen oder hat das einen anderen Zweck?

Ich verwende immer folgenden Standardshader als Vertexshader:
Code:
  1.  
  2. varying vec4 vpos;
  3.  
  4. void main(void)
  5. {
  6.   vpos            = gl_Vertex;
  7.   gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  9.   gl_FrontColor   = gl_Color;
  10. }
  11.  


das Varying vpos enthält dann die Vertexdaten, die brauche ich häufig im Fragmentshader, daher habe ich das in ein Varying gelegt.
Hast du das Tutorial_glsl gelesen? Sieht zwar auf den ersten Blick wie ein Monsterteil aus, aber es lohnt sich durchaus, hat mir für den Einstieg sehr geholfen.

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: Fr Jan 11, 2008 18:17 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Ja hab das Tutorial gelesen, wobei ich es ein wenig...zu theoretisch finde.

Aber danke deinem kleinen Beispielcode hab ich jetzt immerhin mal ein wenig mehr verstanden :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 11, 2008 18:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
ich tippe mal auf ein fehlendes glLoadIdentity. (aus erfahrung :oops: )

obwohl ich glaube dass der compiler das optimiert, so ginge das übrigens auch:

Code:
  1. vec4 a = gl_Vertex;
  2. a *= vec4(0.5, 0.5, 1.0, 1.0);

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 11, 2008 18:32 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Nee LoadIdentity; sollte eigentlich drin sein :-) jetzt gehts ja


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 11, 2008 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Dann schau dir mal das Tutorial_glsl2 an. Man muss sich ja im ersten nicht gleich alles durchlesen, aber es ist ein gutes nachschlagewerk. Im zweiten gehts dann eher ins praktische, man sollte dafür aber denke ich das erste zumindest angelesen haben.

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: Fr Jan 11, 2008 21:57 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Jap hab ich schon. Zusammen genommen sind die beiden Tuts äußerst hilfreich :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 13, 2008 01:45 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
So, ich bin jetzt mal ein wenig weiter, habe allerdings folgendes Problem.
Folgender Code:

Code:
  1.  
  2.    glEnable(GL_TEXTURE_2D);
  3.  
  4.   glActiveTexture(GL_TEXTURE0);
  5.   glBindTexture(GL_TEXTURE_2D,tex1);
  6.   glActiveTexture(GL_TEXTURE1);
  7.   glBindTexture(GL_TEXTURE_2D,tex2);
  8.  
  9.   shader.Use;
  10.  
  11.   glBegin(GL_QUADS);
  12.     glColor3f(1,0,0);
  13.     glMultiTexCoord2f(GL_TEXTURE0,0,0);
  14.     glMultiTexCoord2f(GL_TEXTURE1,0,0);
  15.     glVertex3f(-0.5,-0.5,-1);
  16.  
  17.     glColor3f(0,0,1);
  18.     glMultiTexCoord2f(GL_TEXTURE0,0,1);
  19.     glMultiTexCoord2f(GL_TEXTURE1,0,1);
  20.     glVertex3f(-0.5,0.5,-1);
  21.  
  22.  
  23.     glColor3f(1,0,0);
  24.     glMultiTexCoord2f(GL_TEXTURE0,1,1);
  25.     glMultiTexCoord2f(GL_TEXTURE1,1,1);
  26.     glVertex3f(0.5,0.5,-1);
  27.  
  28.  
  29.     glColor3f(0,0,1);
  30.     glMultiTexCoord2f(GL_TEXTURE0,1,0);
  31.     glMultiTexCoord2f(GL_TEXTURE1,1,0);
  32.     glVertex3f(0.5,-0.5,-1);
  33.   glEnd();
  34.  


Vertex Shader:
Code:
  1.  
  2. void main(void) {
  3.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  4.   gl_FrontColor = gl_Color;
  5.   gl_TexCoord[0]= gl_MultiTexCoord0;
  6.   gl_TexCoord[1]= gl_MultiTexCoord1;
  7. }


Fragment Shader:

Code:
  1.  
  2. uniform sampler2D Texture0;
  3. uniform sampler2D Texture1;
  4. void main(void) {
  5.   vec4 RGB = gl_Color;
  6.   gl_FragColor = texture2D(Texture0, vec2(gl_TexCoord[0])) * RGB.r
  7.                + texture2D(Texture1, vec2(gl_TexCoord[0])) * RGB.b;
  8. }
  9.  


So, die Procedure rendert mir ja jetzt ohne Shader eine Mischung der zwei Texturen hin, wobei diese unten links und oben rechts rot gefärbt sind und dazwischen blau. Soweit sogut.

Jetzt möchte ich mit den Shadern erreichen, dass an den roten Stellen die erste Textur ist, und an den blauen die Zweite, wobei dazwischen genau wie bei einem Farbverlauf ein Texturverlauf (sprich ne Art Blending) erfolgt.
Wenn ich den obigen Fragment-Shader-Code anwende, dann ist das ganze Quadrat voll mit der ersten Textur. Wenn ich jetzt allerdings statt RGB.b einfach RGB.g nehme (grün ist nicht vorhanden), dann rendert er mir unten links und oben rechts die erste Textur hin, und dazwischen läufts ins schwarze, was ja auch vollkommen korrekt ist.

Wieso funktioniert der Fragment-Shader nicht richtig und blendet bei der blauen Fläche nicht die 2. Textur ein?


Dateianhänge:
Dateikommentar: So ist es, wenn ich statt RGB.b einfach RGB.g angebe, da Grün nicht da ist wird es an den nicht roten (=blauen) Stellen auch schwarz
shader1.JPG
shader1.JPG [ 30.25 KiB | 9645-mal betrachtet ]
Dateikommentar: So ist es, wenn ich RGB.R und RGB.B nehme, beide Farben sind da aber es wird trotzdem nur 1. Textur gezeigt
shader2.JPG
shader2.JPG [ 45.62 KiB | 9645-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 13, 2008 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
du hast vergessen im dem Shader mitzuteilen, welche Textureinheiten du als sampler nehmen willst.
Also im Code fehlt:
Code:
  1. glUniform1iARB(glGetUniformLocationARB(ProgramObject, PGLCharARB('Texture0')), 0);
  2. glUniform1iARB(glGetUniformLocationARB(ProgramObject, PGLCharARB('Texture1')), 1);

nach "Shader.Use".
Als ProgramObject musst du dein erstelltes ShaderProgramObject einsetzen.

Gruß,
MatReno

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 21, 2008 22:53 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Sry, dass ich mich so spät erst wieder melde aber daran hats gelegen :-)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 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.013s | 16 Queries | GZIP : On ]