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

Aktuelle Zeit: Do Mär 28, 2024 14:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturübergabe an Shader
BeitragVerfasst: Fr Aug 01, 2014 10:06 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Hallo :-),
Ich habe vor kurzem angefangen mich mit Shadern auseinander zu setzt und wolle in einem Testprogramm den BumpmapShader aus dem Wiki verwenden.
Leider habe ich keines Problem der Texturübergabe per glUniform1iARB, das gezeichnete Objekt erscheint immer schwarz unabhängig vom Licht.

Ich bin mir nicht sicher ob die Texturen im Shader ankommen oder ich sie falsch binde/übergebe, ich habe schon ein paar Einträge
im Forum zu diesem Thema gefunden, aber leider konnte mir keiner helfen. Hier meine Renderschleife:

Code:
  1.  
  2.   wglMakeCurrent(FDC, FRC);
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5.   glUseProgram(FShader);
  6.  
  7.   glActiveTexture(GL_TEXTURE0);
  8.   glEnable(GL_TEXTURE_2D);
  9.   FTextures[0].Bind;
  10.   glUniform1iARB(glGetUniformLocationARB(FShader, PGLCharARB('Tex0')), 0);
  11.  
  12.   glActiveTexture(GL_TEXTURE1);
  13.   glEnable(GL_TEXTURE_2D);
  14.   FTextures[1].Bind;
  15.   glUniform1iARB(glGetUniformLocationARB(FShader, PGLCharARB('Tex1')), 1);
  16.  
  17.   glMatrixMode(GL_PROJECTION);
  18.   glLoadIdentity;
  19.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  20.  
  21.   glMatrixMode(GL_MODELVIEW);
  22.   glLoadIdentity;
  23.  
  24.   glEnable(GL_LIGHTING);
  25.   SetupLight(0);
  26.  
  27.   glTranslatef(0,0,-FScale);
  28.  
  29.   glPushMatrix;
  30.     glRotatef(FRotPos.Y,1,0,0);
  31.     glRotatef(FRotPos.X,0,1,0);
  32.     SetupLight(1);
  33.   glPopMatrix;
  34.  
  35.   glPushMatrix;
  36.     glTranslatef(0, 0, 0);
  37.     glRotatef(EarthAngle, 0.4, 0.8, 0.6);
  38.     DrawObject(10,10,10);
  39.   glPopMatrix;
  40.  
  41.   glDisable(GL_LIGHTING);
  42.   glDisable(GL_LIGHT0);
  43.   glDisable(GL_LIGHT1);
  44.  
  45.   glUseProgram(0);
  46.  
  47.   SwapBuffers(FDC);
  48.  


Beim kompelieren oder linken der Shader treten keine Fehler auf. Ich hoffe Ihr könnt mir bei dem Problem helfen.
Ich bedanke mich schonmal im Voraus! :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Fr Aug 01, 2014 16:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Was liefern die glGetUniformLocationARB? Da muss ein sinniger Wert drinstehen (> -1) der dann dem Bindingpoint im Shader entspricht.

Ansonsten bräuchte man den Shader um zu sehen wo es hapert.

P.S. : Das ARB am Ende kann man weglassen, sind alle längt im Kern.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Fr Aug 01, 2014 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Robocolder hat geschrieben:
das gezeichnete Objekt erscheint immer schwarz unabhängig vom Licht.


Und ohne Licht?

_________________
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: Re: Texturübergabe an Shader
BeitragVerfasst: Sa Aug 02, 2014 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
und wolle in einem Testprogramm den BumpmapShader aus dem Wiki verwenden.

Im Wiki steht Texture0 und du hast Tex0.

Am besten du postest den Shader, warscheinlich hat es dort eine Fehler.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Sa Aug 02, 2014 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Sascha Willems hat geschrieben:
Das ARB am Ende kann man weglassen, sind alle längt im Kern.
Aber wenn man es weglässt, sollte man es überall tun. Daraus können sonst "unerklärliche" Fehler entstehen. Im oben geposteten Quelltext wurde es z.B. bei glUseProgram weggelassen, bei glUniform jedoch nicht.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Sa Aug 02, 2014 19:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Diese Zeile kann man auch einfacher schreiben.
Code:
  1.  glUniform1iARB(glGetUniformLocationARB(FShader, PGLCharARB('Tex1'));
  2. // ersetzten durch
  3.  glUniform1i(glGetUniformLocationARB(FShader, 'Tex1');

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Sa Aug 02, 2014 23:03 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Man sollte sogar ARB nicht mehr verwenden, die Erweiterungen sind schließlich ziemlich alt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Mo Aug 04, 2014 05:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Man kann sich sehr sicher sein, dass die ARB Funktionen auf OpenGL Client Treiber Seite eine eigenen Funkion sind aber auf Server Seite die geiche Routine ansprechen und damit auch kompatibel sind. AMD und NVidia sind da sehr hinterher unnötigen Code raus zu bekommen.

Allerdings sollte man die ARB nicht mit Core mischen, weil man ja bereits davon aus geht, dass diese im Kern verfügbar sind und ein anderer Programmierer dann Rätselt ob es nun erwartet werden darf oder ob Fallback Lösungen verfügbar sein müssen.

Ich kann noch eine Empfehlung für NSight, CodeXL und GPU-Perfstudio geben.
Mit den Tools kann man sehr genau sehen, was der eigene OpenGL Code eigentlich tut.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Mo Aug 04, 2014 07:46 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Hier ist der Vertexshader:
Code:
  1.  
  2. const int LIGHT_COUNT = 3;
  3. varying vec3 N;
  4. varying vec3 V;
  5. varying vec3 lightvec[8];
  6. void main(void)
  7. {
  8.     gl_TexCoord[0]  = gl_MultiTexCoord0;
  9.     N               = normalize(gl_NormalMatrix * gl_Normal);
  10.     V               = vec3(gl_ModelViewMatrix * gl_Vertex);
  11.     for(int i = 0; i < LIGHT_COUNT; i++){
  12.         lightvec[i] = normalize(gl_LightSource[i].position.xyz - V);
  13.     }
  14.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  15. }


Und hier der Fragmentshader:
Code:
  1.  
  2. const int LIGHT_COUNT = 1;
  3. const float PI = 3.14159265;
  4. varying vec3 N;
  5. varying vec3 V;
  6. varying vec3 lightvec[LIGHT_COUNT];
  7. uniform sampler2D Tex0;
  8. uniform sampler2D Tex1;
  9.  
  10. void main(void){
  11.     vec2 TexCoord = vec2(gl_TexCoord[0]);
  12.     vec3 Eye = normalize(-V);
  13.  
  14.     vec3 q0 = dFdx(Eye.xyz);
  15.     vec3 q1 = dFdy(Eye.xyz);
  16.     vec2 st0 = dFdx(TexCoord.st);
  17.     vec2 st1 = dFdy(TexCoord.st);
  18.    
  19.     vec3 S = normalize( q0 * st1.t - q1 * st0.t);
  20.     vec3 T = normalize(-q0 * st1.s + q1 * st0.s);
  21.    
  22.     mat3 M = mat3(-T, -S, N);
  23.     vec3 normal = normalize(M * (vec3(texture2D(Tex1, TexCoord)) - vec3(0.5, 0.5, 0.5)));
  24.    
  25.     vec4 EndColor = vec4(0.0, 0.0, 0.0, 0.0);
  26.     vec4 EndSpec  = vec4(0.0, 0.0, 0.0, 0.0);
  27.     for(int i = 0; i < LIGHT_COUNT; i++){
  28.         vec3 Reflected = normalize(reflect(-lightvec[i], normal));
  29.         vec4 IAmbient  = gl_LightSource[i].ambient  * gl_FrontMaterial.ambient;
  30.         vec4 IDiffuse  = gl_LightSource[i].diffuse  * gl_FrontMaterial.diffuse  * max(dot(normal, lightvec[i]), 0.0);
  31.         vec4 ISpecular = gl_LightSource[i].specular * gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
  32.         EndColor += (IAmbient+IDiffuse);
  33.         EndSpec  += ISpecular;
  34.     }
  35.     EndColor += gl_FrontMaterial.emission;
  36.  
  37.     gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor + EndSpec) * texture2D(Tex0, TexCoord);
  38. }


Zitat:
Was liefern die glGetUniformLocationARB? Da muss ein sinniger Wert drinstehen (> -1) der dann dem Bindingpoint im Shader entspricht.

glGetUniformLocationARB sowie glGetUniformLocation geben bei "tex0" einen "0" und bei "tex1" eine "1" zurück.

Zitat:
Und ohne Licht?

Auch ohne Licht erscheint das gezeichnete Objekt in schwarz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Mo Aug 04, 2014 07:53 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Hier noch ein Screenshot der Szene :-)

Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Mo Aug 04, 2014 08:22 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Du hast kein Material gesetzt. Im Shader werden aber glFrontMaterial etc verwendet. Ich sehe aber im Programmquellcode keinerlei glMaterial Aufrufe.

Außerdem bin ich mir nicht sicher ob
Zitat:
varying vec3 lightvec[LIGHT_COUNT];

im Fragmentshader (LIGHT_COUNT=1) die gleiche Größe wie im Vertexshader (LIGHT_COUNT=3) haben sollte.

_________________
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: Re: Texturübergabe an Shader
BeitragVerfasst: Mo Aug 04, 2014 08:36 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Hab meinen Fehler gefunden :roll:
Ich habe den alten Shader von Bergmann89 aus diesem Beitrag benutzt. :(

Jedoch sind mit dem original Shader aus dem Wiki ein weiters Problem aufgetaucht. Die Textur wird immer in Blau ausgezeigt.
Hier ein paar Screenshots:

Bild

Base Textur:

Bild

Bumpmap Textur:

Bild

Danke schon mal für eure schnelle Hilfe :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Mo Aug 04, 2014 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Könntest du den verwendeten Shadercode nochmal posten (oder ist das der gleiche wie oben)?

viele Grüße,
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: Re: Texturübergabe an Shader
BeitragVerfasst: Di Aug 05, 2014 11:41 
Offline
DGL Member

Registriert: Fr Nov 22, 2013 09:19
Beiträge: 11
Wohnort: Sauerland
Programmiersprache: Delphi XE2
Hier sind noch mal meine Shader, sind die auf dem Wiki. :-)

Fragmentshader:
Code:
  1.  
  2. const int LIGHT_COUNT = 1;
  3. const float PI = 3.14159265;
  4. varying vec3 N;
  5. varying vec3 V;
  6. varying vec3 lightvec[LIGHT_COUNT];
  7. uniform sampler2D Tex0;
  8. uniform sampler2D Tex1;
  9.  
  10. void main(void){
  11.     vec2 TexCoord = vec2(gl_TexCoord[0]);
  12.     vec3 Eye = normalize(-V);
  13.  
  14.     vec3 q0 = dFdx(Eye.xyz);
  15.     vec3 q1 = dFdy(Eye.xyz);
  16.     vec2 st0 = dFdx(TexCoord.st);
  17.     vec2 st1 = dFdy(TexCoord.st);
  18.  
  19.     vec3 S = normalize( q0 * st1.t - q1 * st0.t);
  20.     vec3 T = normalize(-q0 * st1.s + q1 * st0.s);
  21.  
  22.     mat3 M = mat3(-T, -S, N);
  23.     vec3 normal = normalize(M * (vec3(texture2D(Texture1, TexCoord)) - vec3(0.5, 0.5, 0.5)));
  24.  
  25.     vec4 EndColor = vec4(0.0, 0.0, 0.0, 0.0);
  26.     vec4 EndSpec  = vec4(0.0, 0.0, 0.0, 0.0);
  27.     for(int i = 0; i < LIGHT_COUNT; i++){
  28.         vec3 Reflected = normalize(reflect(-lightvec[i], normal));
  29.         vec4 IAmbient  = gl_LightSource[i].ambient  * gl_FrontMaterial.ambient;
  30.         vec4 IDiffuse  = gl_LightSource[i].diffuse  * gl_FrontMaterial.diffuse  * max(dot(normal, lightvec[i]), 0.0);
  31.         vec4 ISpecular = gl_LightSource[i].specular * gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
  32.         EndColor += (IAmbient+IDiffuse);
  33.         EndSpec  += ISpecular;
  34.     }
  35.     EndColor += gl_FrontMaterial.emission;
  36.  
  37.     gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor + EndSpec) * texture2D(Texture0, TexCoord);
  38. }
  39.  


VertexShader:
Code:
  1.  
  2. const int LIGHT_COUNT = 1;          //Anzahl der berücksichtigten Lichter
  3. varying vec3 N;             //NormalenVektor
  4. varying vec3 V;             //VertexVektor 
  5. varying vec3 lightvec[LIGHT_COUNT]; //LichtVektor(en)
  6. void main(void)
  7. {
  8.     gl_TexCoord[0]  = gl_MultiTexCoord0;
  9.     N           = normalize(gl_NormalMatrix * gl_Normal);
  10.     V       = vec3(gl_ModelViewMatrix * gl_Vertex);
  11.     for(int i = 0; i < LIGHT_COUNT; i++){
  12.         lightvec[i] = normalize(gl_LightSource[i].position.xyz - V);
  13.     }
  14.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  15. }
  16.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturübergabe an Shader
BeitragVerfasst: Di Aug 05, 2014 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde mal schrittweise testen, Teile des Codes zu deaktivieren (und die berechneten Farben mit weiß zu ersetzen). Z.B. den Beleuchtungskram mal kurz rauszupacken, um festzustellen, ob einfach irgendein Licht unfug macht.

grüße,
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.071s | 17 Queries | GZIP : On ]