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

Aktuelle Zeit: Fr Jul 18, 2025 03:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Apr 07, 2010 17:27 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

ich experimentiere seit einigen Tagen mit dem OGL 4.0 Betatreiber von ATI auf meiner HD 5770, speziell mit dem Tessellator. Ich habe den entsprechenden Artikel in der OpenGL Registry durchgearbeitet (http://www.opengl.org/registry/specs/ARB/tessellation_shader.txt) und bin bei meinen ersten Experimenten auf einige Probleme gestoßen. Ich habe versucht, ein einfaches Dreieck zu tessellieren. Dabei hatte ich folgende Probleme:


1. Der Tessellation Control Shader kann nicht auf die Output Arrays "gl_TessLevelOuter[]" und "gl_TessLevelInner[]" zugreifen, bei dem Versuch bekomme ich eine InvalidOperation. Dies muss aber möglich sein:
Zitat:
Tessellation Control Shader Outputs
[..]
Tessellation shaders additionally have two built-in per-patch output
arrays, gl_TessLevelOuter[] and gl_TessLevelInner[].



2. Der Tessellation Control Shader kann keine out-Variablen setzen. Laut Registry müssen alle vertexsprezifischen "out"-Variablen als Arrays definiert sein:
Zitat:
A tessellation control shader may also declare user-defined per-vertex
output variables. User-defined per-vertex output variables are declared
with the qualifier "out" and have a value for each vertex in the output
patch. Such variables must be declared as arrays or inside output blocks
declared as arrays.
Wenn ich keine Größe für das Array angebe, bekomme ich beim Kompilieren die Meldung: " '[' array must be redeclared with a size before being indexed with a variable". Wenn ich eine beliebige Größe angebe, bekomme ich die Meldung: Input sizes are inconsistent."


3. Wenn ich den Tessellation Control Shader vewende, flimmert mein Dreieck entwerder oder erscheint überhaupt nicht.


4. Wegen der Probleme mit dem Tessellation Control Shader habe ich mich entschieden, vorerst nur Tesselation Evaluation Shader zu verwenden. Dies funktionierte auch einigermaßen, allerdings hatte ich einen sehr komischen Bug: Das tesselierte Dreieck erschien doppelt (siehe Bild unten). Dies konnte ich beheben, indem ich überprüft habe, ob die baryzentrische Koordinate im Bereich 0..1 ist (was bei dem zusätzlichen Dreieck nicht der Fall war). Texturen, Farben etc. funktionieren aber ohne Tessellation Control Shader problemlos.

Mein gekürztes Hauptprogramm:

Code:

unit u_test2;

type
  TForm1 = class [...]

procedure TForm1.glDraw();
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
                           

  glslprogram.Enable;
  glslprogram.SetI('Tex0', 0);

  glBindVertexArray(vaoID[0]);      
   glDrawArrays(GL_PATCHES, 0, 3);   
 
  glBindVertexArray(0);

  glslprogram.Disable;
end;

procedure TForm1.glInit();
var
  vert: array[0..8] of GLFloat;   //vertex array 1
  col: array[0..8] of GLFloat;    //Color array 1
  tex: array[0..8] of GLFloat;    //TexCoord array 1
  testdata1: array[0..3] of GLFloat;
  testdata2: array[0..1] of GLFloat;
begin
  LoadTexture('blitz.jpg', tex0);

  glslprogram := TGLSLProgram.Create();
  glslvert := TGLSLShader.Create('tess.vert');
  glsltcs := TGLSLShader.Create('tess.tcs', GL_TESS_CONTROL_SHADER);
  glsltes := TGLSLShader.Create('tess.tes', GL_TESS_EVALUATION_SHADER);
  glslfrag := TGLSLShader.Create('tess.frag', GL_FRAGMENT_SHADER_ARB);

  glslprogram.Attach(glslvert);
  showmessage(glslvert.Log);
//glslprogram.Attach(glsltcs);
//showmessage(glsltcs.Log);
  glslprogram.Attach(glsltes);
  showmessage(glsltes.Log);
  glslprogram.Attach(glslfrag); 
  showmessage(glslfrag.Log);

  glslprogram.BindAttribLocation('in_Position',0);
  glslprogram.BindAttribLocation('in_Color',1);
  glslprogram.BindAttribLocation('in_TexCoord',2);

  glslprogram.Link;

  // VAO erstellen

  glClearColor(0.3, 0.3, 0.3, 0.0);
 
  //Tessellation
                             
  glPatchParameteri(GL_TESS_GEN_MODE, GL_TRIANGLES);
  glPatchParameteri(GL_PATCH_VERTICES, 3);
  testdata1[0] := 20.0;
  testdata1[1] := 20.0;
  testdata1[2] := 20.0;
  testdata1[3] := 20.0;
 
  testdata2[0] := 20.0;
  testdata2[1] := 20.0;

  glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, @testdata1[0]);
  glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, @testdata2[0]);

  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

  Timer1.Enabled := true;
end;

[...]

procedure TForm1.FormCreate(Sender: TObject);     
begin
  //OGL 4.0 Context erstellen
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  glViewport(0, 0, Width, Height);
end;

end.

Meine Shader (Vertex- und Fragmentshader machen nichts Besonderes):
Code:
Tessellation Control Shader:

#version 150

#extension GL_EXT_tessellation_shader : require

//Tessellation Control Shader

      in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_in[gl_MaxPatchVertices];

      out gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_out[gl_VerticesOut];


void main(void)
{
  gl_out[gl_InvocationID] = gl_in[gl_InvocationID];
/*  gl_TessLevelOuter[0] = 3.0;
  gl_TessLevelOuter[1] = 3.0;
  gl_TessLevelOuter[2] = 3.0;
  gl_TessLevelOuter[3] = 3.0;
  gl_TessLevelInner[0] = 2.0;
  gl_TessLevelInner[1] = 2.0;*/
}

Tessellation Evaluation Shader:

#version 150

#extension GL_EXT_tessellation_shader : require
#define GL_ARB_tessellation_shader 1

//Tessellation Control Shader

      in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_in[gl_MaxPatchVertices];

      out gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      };
    
   in vec3 ex1_Color[];
   in vec3 ex1_TexCoord[];
   out vec3 ex_Color;
   out vec3 ex_TexCoord;


void main(void)
{
  gl_Position = vec4(0.0);
  if ((gl_TessCoord.x >= 0.0) && (gl_TessCoord.y >= 0.0) && (gl_TessCoord.z >= 0.0)) //ohne diese Zeile erscheint das doppelte Dreieck
  {
    ex_Color = vec3(0.0);
    ex_TexCoord = vec3(0.0);
    for(int i = 0; i < 3; i++)
    {
      gl_Position += gl_in[gl_PrimitiveID*3+i].gl_Position*gl_TessCoord[i];
     ex_Color += ex1_Color[gl_PrimitiveID*3+i]*gl_TessCoord[i];
     ex_TexCoord += ex1_TexCoord[gl_PrimitiveID*3+i]*gl_TessCoord[i];
   }
  }
}


Hat jemand eine Idee, wie ich die o.g. Probleme beheben kann? Oder liegen die aller Warscheinlichkeit nach an dem Betatreiber?

Für Hilfe wäre ich sehr dankbar.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 20, 2010 13:19 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
ich habe das Problem nun endlich lösen können, es hatte einen Haufen Ursachen. Unten habe ich meine jetzt funktionierenden Shader gepostet.

TCS:
Code:
#version 150

#extension GL_ARB_tessellation_shader : require
#define GL_ARB_tessellation_shader 1

layout (vertices = 3) out;

//Tessellation Control Shader
   
  in vec3 ex1_Color[];
  in vec3 ex1_TexCoord[];

  out vec3 ex2_Color[];
  out vec3 ex2_TexCoord[];

void main(void)
{
  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
  ex2_Color[gl_InvocationID] = ex1_Color[gl_InvocationID];
  ex2_TexCoord[gl_InvocationID] = ex1_TexCoord[gl_InvocationID];
  gl_TessLevelOuter[0] = 20.0;
  gl_TessLevelOuter[1] = 20.0;
  gl_TessLevelOuter[2] = 20.0;
  gl_TessLevelOuter[3] = 20.0;
  gl_TessLevelInner[0] = 20.0;
  gl_TessLevelInner[1] = 20.0;
}


und mein TES:
Code:
#version 150

#extension GL_ARB_tessellation_shader : require
#define GL_ARB_tessellation_shader 1

layout (triangles) in;
layout (fractional_even_spacing) in;

uniform sampler2D Tex0;

//Tessellation Control Shader

  in vec3 ex2_Color[];
  in vec3 ex2_TexCoord[];
  out vec3 ex_Color;
  out vec3 ex_TexCoord;

void main(void)
{
  gl_Position = vec4(0.0);
    ex_Color = vec3(0.0);
    ex_TexCoord = vec3(0.0);
    for(int i = 0; i < 3; i++)
    {
       gl_Position += gl_in[i].gl_Position*gl_TessCoord[i];
       ex_Color += ex2_Color[i]*gl_TessCoord[i];
       ex_TexCoord += ex2_TexCoord[i]*gl_TessCoord[i];
    }
}


Gruß Joni.

P.S. Wie gehen nochmal die Code-Tags? Weder [glsl] noch [ code=glsl] funktionieren.


Zuletzt geändert von Joni am Do Jun 24, 2010 20:29, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 20, 2010 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
P.S. Wie gehen nochmal die Code-Tags? Weder [glsl] noch [ code=glsl] funktionieren.

Syntax-Highlight geht seit dem letzten Forenupdate leider nicht mehr. Es gibt nur [ code ].

Thx für deinen Shader :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 24, 2010 20:28 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Kurzes Update: Falls sich noch jemand damit herumschlagen will, oben ist ein Fehler im TES, den ich bisher nicht bemerkt habe:

Code:
      gl_Position += gl_in[gl_PrimitiveID*3+i].gl_Position*gl_TessCoord[i];
       ex_Color += ex2_Color[gl_PrimitiveID*3+i]*gl_TessCoord[i];
       ex_TexCoord += ex2_TexCoord[gl_PrimitiveID*3+i]*gl_TessCoord[i];


Korrekt siehts so aus:
Code:
      gl_Position += gl_in[i].gl_Position*gl_TessCoord[i];
       ex_Color += ex2_Color[i]*gl_TessCoord[i];
       ex_TexCoord += ex2_TexCoord[i]*gl_TessCoord[i];


Das war mir bisher nicht aufgefallen, aber ab 2 Dreiecken wird mit der alten Version nichts mehr gerendert.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]