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

Aktuelle Zeit: So Jun 16, 2024 15:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 09:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Ich schreibe aktuell an einem Programm, dass (beliebige) Funktionen zeichnen soll. Die Funktion soll dabei in in einen Vertexshader eingebaut werden, und das funktioniert soweit auch.

Das Problem dabei ist, dass ich die Normalen nicht vorher berechnen kann, da die Funktion beim Kompilieren noch nicht bekannt ist. Deshalb musste dafür ein Geometryshader her. Ursprünglich gabs noch ein paar AccessViolations in der atioglxx.dll, seitdem ich im Immediate mode rendere sind die aber weg.

Jedenfalls, das Problem ist folgende Fehlermeldung:
Code:
ERROR: error(#277) Symbol 'pos[0]' usage doesn't match between two stages


in folgendem Shader:
Code:
varying in vec3 pos[4];
varying out vec3 position;
varying out vec3 normal;

void main() {
   vec3 Normal = ((pos[3] - pos[1]) * (pos[3] - pos[2])).xyz;
   /*for (int i1 = 0; i1 < 4; ++i1) {
      position = pos[i1];
      normal = Normal;
      gl_Position = gl_PositionIn[i1];
      EmitVertex();
   }*/  // ursprünglich benutzte ich diese Schleife. Hab dann probiert, ob die den Fehler verursacht, lag aber falsch

   position = pos[0];
   normal = Normal;
   gl_Position = gl_PositionIn[0];
   EmitVertex();

   position = pos[1];
   normal = Normal;
   gl_Position = gl_PositionIn[1];
   EmitVertex();

   position = pos[2];
   normal = Normal;
   gl_Position = gl_PositionIn[2];
   EmitVertex();

   position = pos[3];
   normal = Normal;
   gl_Position = gl_PositionIn[3];
   EmitVertex();
}


noch eigenartiger ist jedoch, dass ich dieselbe Fehlermeldung bakomme, wenn ich alle indices um 1 erhöhe. Dann kommt im Code nämlich kein 'pos[0]' mehr vor.

möglicherweise ist auch an den ProgramParamereri was falsch, ich wüsste aber nicht, was da falsch sein soll
Code:
  glProgramParameteriEXT(FProgram, GL_GEOMETRY_VERTICES_OUT_EXT, 4);
  glProgramParameteriEXT(FProgram, GL_GEOMETRY_INPUT_TYPE_EXT, GL_Quads);
  glProgramParameteriEXT(FProgram, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_Quad_STRIP);


mfg & thx

Sharkman

ps: Radeon HD 4650, Catalyst 10.6


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 09:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
möglicherweise ist auch an den ProgramParamereri was falsch, ich wüsste aber nicht, was da falsch sein soll
Code:
  glProgramParameteriEXT(FProgram, GL_GEOMETRY_VERTICES_OUT_EXT, 4);
  glProgramParameteriEXT(FProgram, GL_GEOMETRY_INPUT_TYPE_EXT, GL_Quads);
  glProgramParameteriEXT(FProgram, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_Quad_STRIP);


GL_QUADS ist als Input-Typ nicht erlaubt. Wenn du Quads renderst musst du im Geometryshader wahrscheinlich GL_TRIANGLES nehmen, probiert hab ich das aber nicht.
Siehe auch http://wiki.delphigl.com/index.php/GL_E ... nput-Typen

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 09:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
hab input auf GL_TRIANGLES gestellt, und output auf GL_TRIANGLE_STRIP, gibt aber immer noch dieselbe Fehlermeldung. Es wird auch nach wie vor erwähnt, dass alle drei shader 'was successfully compiled to run on hardware' :?: . Die Fehlermeldung kommt übrigens doppelt, falls das irgendwas hilft.

der aktuelle shader ist:
Code:
varying in vec3 pos[3];
varying out vec3 position;
varying out vec3 normal;

void main() {
   vec3 Normal = ((pos[0] - pos[1]) * (pos[0] - pos[2])).xyz;
   /*for (int i1 = 0; i1 < 3; ++i1) {
      position = pos[i1];
      normal = Normal;
      gl_Position = gl_PositionIn[i1];
      EmitVertex();
   }*/

   position = pos[0];
   normal = Normal;
   gl_Position = gl_PositionIn[0];
   EmitVertex();

   position = pos[1];
   normal = Normal;
   gl_Position = gl_PositionIn[1];
   EmitVertex();

   position = pos[2];
   normal = Normal;
   gl_Position = gl_PositionIn[2];
   EmitVertex();   
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 10:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Es fehlt das aktivieren den Geometryshader-Extension (im Shader als erste Zeile):
Code:
#extension GL_EXT_geometry_shader4: enable

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 12:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
steht jetzt im Shader, ändert aber auch nichts an der Fehlermeldung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 13:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zeig mal bitte alle drei Shader. Der Fehler kommt ja beim linken, oder? Das würde heißen die Shader sind für sich genommen ok, passen aber nicht zusammen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 13:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Übrigens, Google sagt:
Zitat:
Those usually imply that you have declared the same name as an attribute in the vertex shader, and a uniform in the fragment shader. Double-check your names, and make sure there are *no* overlaps.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 14:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
//edit: konnte nicht zeichnen. ich hatte glBegin(GL_QUADS), aber der Geometryshader nimmt nur Triangles

im VertexShader hatte ich position statt pos. Jetzt ist die Fehlermeldung weg, aber zeichnen tuts immer noch nicht :(

Vertex Shader:
Code:
uniform int time;
varying vec3 pos;

void main() {
  vec4 Vertex = gl_Vertex;

  // da kommt die Funktion rein
 
  gl_Position = gl_ModelViewProjectionMatrix * Vertex;
  gl_FrontColor = gl_Color;
  pos = vec3(gl_ModelViewMatrix * Vertex);
}


Geometryshader:
Code:
#extension GL_EXT_geometry_shader4: enable

varying in vec3 pos[3];
varying out vec3 position;
varying out vec3 normal;

void main() {
   vec3 Normal = ((pos[0] - pos[1]) * (pos[0] - pos[2])).xyz;
   for (int i1 = 0; i1 < 3; ++i1) {
      position = pos[i1];
      normal = Normal;
      gl_Position = gl_PositionIn[i1];
      EmitVertex();
   }   
}


FragmentShader (der könnte bekannt vorkommen. ist aus der Shadersammlung):
Code:
uniform sampler2D Texture0;
uniform int ActiveLights;
 
varying vec3 position;
varying vec3 normal;
 
void main(void)
{
  vec3 lightDir;
  float  attenFactor;
  vec3 eyeDir          = normalize(-position); // camera is at (0,0,0) in ModelView space
  vec4 lightAmbientDiffuse    = vec4(0.0,0.0,0.0,0.0);
  vec4 lightSpecular       = vec4(0.0,0.0,0.0,0.0);    
 
  // iterate all lights
  for (int i=0; i<ActiveLights; ++i)
  {
   // attenuation and light direction
   if (gl_LightSource[i].position.w != 0.0)
   {
      // positional light source
      float dist   = distance(gl_LightSource[i].position.xyz, position);
      attenFactor   = 1.0/(   gl_LightSource[i].constantAttenuation +
               gl_LightSource[i].linearAttenuation * dist +
               gl_LightSource[i].quadraticAttenuation * dist * dist );
      lightDir   = normalize(gl_LightSource[i].position.xyz - position);
   }      
   else
   {         
      // directional light source         
      attenFactor   = 1.0;         
      lightDir   = gl_LightSource[i].position.xyz;      
   }       
   // ambient + diffuse      
   lightAmbientDiffuse    += gl_FrontLightProduct[i].ambient*attenFactor;      
   lightAmbientDiffuse    += gl_FrontLightProduct[i].diffuse * max(dot(normal, lightDir), 0.0) * attenFactor;
   // specular      
   vec3 r       = normalize(reflect(-lightDir, normal));
   lightSpecular    += gl_FrontLightProduct[i].specular *
               pow(max(dot(r, eyeDir), 0.0), gl_FrontMaterial.shininess) *
               attenFactor;   
  }    
  // compute final color   
  vec4 texColor = gl_Color;// * texture2D(Texture0, gl_TexCoord[0].xy);   
  gl_FragColor    = texColor * (gl_FrontLightModelProduct.sceneColor + lightAmbientDiffuse) + lightSpecular;
 
  float fog   = (gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale;   // Intensität berechnen
  fog      = clamp(fog, 0.0, 1.0);              // Beschneiden
  gl_FragColor    = mix(gl_Fog.color, gl_FragColor, fog);        // Nebelfarbe einmischen
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
//edit: konnte nicht zeichnen. ich hatte glBegin(GL_QUADS), aber der Geometryshader nimmt nur Triangles

Soll das es heißen es funktioniert jetzt?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Jetzt gehts theoretisch, aber die Normalen, die der Geometryshader ausspuckt sind nach wie vor eher merkwürdig. x und y kommt mir irgendwie mehr oder weniger vertauscht vor, während z viel zu hochfrequent ist(was bei einer niedrigfrequenten sinusfunktion nicht unbedingt sein sollte). der Fragmentshader wil auch nicht ganz so wie ich, er setzt alle pixeln schwarz. (um die Normalen anzusehen hab ich einen anderen Fragmentshader angehängt)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 15:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
die hohe Frequenz in z richtung war dadurch bedingt, dass ich die hälfte der dreiecke kervehrt herum definiert habe. jetzt bleibt eigentlich nur noch das Problem mit der Beleuchtung ( ist auch nicht unbedingt nötig, soll ja nur Funktionen zeichnen ), und dass es im Immediate Mode A****lamgsam ist. Mit Displaylisten wirds auch eher noch langsamer


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Mit Displaylisten wirds auch eher noch langsamer

Displaylisten richtig angewendet sind das schnellste was es gibt. Dafür machen die aber nur bei statischer Geometrie Sinn. Wenn sich die Geometrie häufig ändert sind VBOs das Mittel der Wahl.

Zitat:
Jetzt gehts theoretisch, aber die Normalen, die der Geometryshader ausspuckt sind nach wie vor eher merkwürdig

Lass dir doch mal die Normalen als Farbe im Fragmentshader ausgeben. Dann siehst du schnell ob die vielleicht teilweise in die falsche Richtung (z.B. durch Vorzeichenfehler) zeigen oder so.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 18:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Lass dir doch mal die Normalen als Farbe im Fragmentshader ausgeben. Dann siehst du schnell ob die vielleicht teilweise in die falsche Richtung (z.B. durch Vorzeichenfehler) zeigen oder so.

So hab ich doch erst herausgefunden, dass sie vielleicht etwas merkwürdig sind. hab bloß Probleme, da was zu erkennen.

Zitat:
Displaylisten richtig angewendet sind das schnellste was es gibt. Dafür machen die aber nur bei statischer Geometrie Sinn. Wenn sich die Geometrie häufig ändert sind VBOs das Mittel der Wahl.

:?: meine Geometrie ist doch statisch. eine einfache XZ Ebene. alles, was sich da ändert, wird im Vertexshader berechnet.

zudem krieg ich auch wenn ich statt ca. 60k Dreiecke nur ca. 10k Dreiecke zeichne keine besseren Frameraten. genau weiß ichs nicht, weil ich bisher keinen Framecounter eingebaut hab, aber so Daumen * Pi sinds 1 FPS. variiert auch ziemlich stark, nur halt unabhängig von der Anzahl der Dreiecke.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Das Problem mit den Normalen ist gelöst. Hab noch nen alten Backup von meiner Kameraklasse verwendet. Und da hab ich die Rotation in die Projectionsmatrix geschrieben. Das kann nicht gut gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: eigenartige Fehlermeldung
BeitragVerfasst: Mi Jun 23, 2010 22:19 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich bin zwar Shader-technisch etwas bewandert. Was Geometry Shader angeht allerdings nicht so dolle.
Könnte mir jemand erläutern was o.g. Shader macht? Habe das immer so verstanden das man gl_Position ändert bevor man den Vertex emittiert. Findet da Tesselierung statt? Wird da automatisch interpoliert zwischen dem Vertex und dem Geometry Shader?

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 27 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.086s | 17 Queries | GZIP : On ]