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

Aktuelle Zeit: Mi Aug 06, 2025 14:00

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jun 20, 2005 09:54 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Salut,

ich habe das Problem, das mein Proggi beim Aufruf von glUseProgramObjectARB eine GL_INVALID_OPERATION wirft.

Ein Blick ins WIKI zeigt mir folgende Möglichkeiten:

Zitat:
GL_INVALID_OPERATION wird generierrt wenn programObj nicht vom Typ GL_PROGRAM_OBJECT_ARB ist.
GL_INVALID_OPERATION wird generiert wenn das Programm nicht installiert werden konnte.
GL_INVALID_OPERATION wird generiert wenn glUseProgramObjectARB zwischen einem glBegin und dem zugehörigen glEnd aufgerufen wird.

Die letzte Möglichkeit kann ich definitiv ausschliessen. Die beiden anderen nicht zu 100%. Eigentlich sollte dann ja das folgende nicht passieren:

Ein Aufruf von
Code:
  1.  
  2. glValidateProgramARB(SlangProg);
  3. glGetObjectParameterivARB(SlangProg,GL_OBJECT_VALIDATE_STATUS_ARB,@Validate);
  4.  

gibt mir aber in der Variable Validate eine 1 zurück. (1 = TRUE = Valid) und das GLSL InfoLog ist auch leer.

Der Shader wird ordnungsgemäß gelinkt (zumindest ohne Fehlermeldung). Auch mit glIsValidate von 3DLabs meldet er keine Probleme.

Kann ich irgendwie rausbekommen, warum der sowas macht?

So sieht es aus wenn ich den Shader erzeuge:
Code:
  1.  
  2. SlangProg := glCreateProgramObjectARB();
  3. VertSlang := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  4. FragSlang := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  5.  
  6. VertLength := Length(GLSL_VERT_COORDINATE);
  7. FragLength := Length(GLSL_FRAG_SHADERMAP);
  8.  
  9. glShaderSourceARB(VertSlang,1,@GLSL_VERT_COORDINATE,@VertLength);
  10. glShaderSourceARB(FragSlang,1,@GLSL_FRAG_SHADERMAP,@FragLength);
  11.  
  12. glCompileShaderARB(VertSlang);
  13. ShowMessage(glSlang_GetInfoLog(VertSlang));
  14. glCompileShaderARB(FragSlang);
  15. ShowMessage(glSlang_GetInfoLog(FragSlang));
  16.  
  17. glAttachObjectARB(SlangProg,VertSlang);
  18. glAttachObjectARB(SlangProg,FragSlang);
  19.  
  20. glDeleteObjectARB(VertSlang);
  21. glDeleteObjectARB(FragSlang);
  22.  
  23. glLinkProgramARB(SlangProg);
  24. ShowMessage(glSlang_GetInfoLog(SlangProg));
  25.  


Hier wird er aufgerufen und mit Variablen gefüttert:
Code:
  1.  
  2. glValidateProgramARB(SlangProg);
  3. glGetObjectParameterivARB(SlangProg,GL_OBJECT_VALIDATE_STATUS_ARB,@Validate);
  4.  
  5. Mesg := glSlang_GetInfoLog(SlangProg);
  6. if Mesg <> '' then
  7.   ShowMessage(Mesg);
  8.  
  9. glUseProgramObjectARB(SlangProg);
  10.  
  11. glUniform1iARB(glGetUniformLocationARB(SlangProg,PGLCharARB('DataTexture')),0);
  12. glUniformMatrix4fvARB(glGetUniformLocationARB(SlangProg,PGLCharARB('CM')),16,false,PGLFloat(@CM));
  13. glUniform4fARB(glGetUniformLocationARB(SlangProg,PGLCharARB('kd')),1.0,1.0,1.0,1.0);
  14. glUniform4fARB(glGetUniformLocationARB(SlangProg,PGLCharARB('Ia')),0.0,0.0,0.0,0.0);
  15.  


Und das sind die zwei Shader:

Vertex Shader: (GLSL_VERT_COORDINATE)
Code:
  1.  
  2. void main(void) {
  3.     vec4 EyeVertex = gl_ModelViewMatrix*gl_Vertex;
  4.     gl_TexCoord[0].s = dot( EyeVertex, gl_EyePlaneS[0] );
  5.     gl_TexCoord[0].t = dot( EyeVertex, gl_EyePlaneT[0] );
  6.     gl_TexCoord[0].p = dot( EyeVertex, gl_EyePlaneR[0] );
  7.     gl_TexCoord[0].q = dot( EyeVertex, gl_EyePlaneQ[0] );
  8.     gl_Position = ftransform();
  9. }
  10.  


Fragment Shader (GLSL_FRAG_SHADERMAP)
Code:
  1.  
  2. uniform sampler3D DataTexture;
  3. uniform mat4 CM;
  4. uniform vec4 kd;
  5. uniform vec4 Ia;
  6.  
  7. void main(void) {
  8.     vec4 DepVec;
  9.     DepVec.rgba = texture3D(DataTexture,gl_TexCoord[0].stp);
  10.     gl_FragColor = Ia + kd*CM*DepVec;
  11. }
  12.  


Lustigerweise funktioniert es ohne Probleme, wenn ich den folgenden Fragment-Shader nehme:
Code:
  1.  
  2. uniform sampler3D DataTexture;
  3. uniform sampler1D MyColorMap;
  4.  
  5. void main(void) {
  6.     vec4 DepVec;
  7.     vec4 NewVec;
  8.  
  9.     DepVec.rgba = texture3D(DataTexture,gl_TexCoord[0].stp);
  10.     NewVec.rgba = texture1D(MyColorMap,DepVec.a);
  11.  
  12.     gl_FragColor = vec4(NewVec.rgb,DepVec.a);
  13. }
  14.  

Init-Teil habe ich einfach kopiert, eingefügt und lediglich die Namen geändert.

Hat jemand ne schöne Idee?

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 10:49 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Ok, hab den Fehler weiter eingeschränkt.

Also in der folgenden Prozedur funktioniert es mit beiden Shadern (GLSL_FRAG_SHADERMAP und GLSL_FRAG_COLORMAP)
Code:
  1.  
  2. procedure TVolumeViewer.AssignColorMap(var _d : array of Single; _Length : Integer; _GLTexType : Cardinal);
  3. var
  4.   i : Integer;
  5.   s : String;
  6.   VertSlang : GLHandleARB;
  7.   FragSlang : GLHandleARB;
  8.   VertLength,
  9.   FragLength : Integer;
  10. begin
  11.   ActivateRenderingContext(DC,RC,false);
  12.  
  13.   if @glTexImage3D <> nil then
  14.       glDisable(GL_TEXTURE_3D)
  15.   else
  16.     glDisable(GL_TEXTURE_3D_EXT);
  17.  
  18.   glActiveTexture(GL_TEXTURE1);
  19.   glEnable(GL_TEXTURE_1D);
  20.   glGenTextures(1,@TexColorMap);
  21.   glBindTexture(GL_TEXTURE_1D,TexColorMap);
  22.  
  23.   glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  24.   glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  25.   glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S, GL_CLAMP);
  26.  
  27.   glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA,_Length,0,_GLTexType,GL_FLOAT,PGLFLOAT(@_d));
  28.   glDisable(GL_TEXTURE_1D);
  29.  
  30.     FColorMap := true;
  31.   setLength(MyColorMap, Length(_d));
  32.   for i := Low(MyColorMap) to High(MyColorMap) do
  33.     MyColorMap[i] := _d[i];
  34.  
  35.   if FUseSlang then begin
  36.     SlangProg := glCreateProgramObjectARB();
  37.     VertSlang := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  38.     FragSlang := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  39.  
  40.     VertLength := Length(GLSL_VERT_COORDINATE);
  41.     FragLength := Length(GLSL_FRAG_COLORMAP);
  42.  
  43.     glShaderSourceARB(VertSlang,1,@GLSL_VERT_COORDINATE,@VertLength);
  44.     glShaderSourceARB(FragSlang,1,@GLSL_FRAG_COLORMAP,@FragLength);
  45.  
  46.     glCompileShaderARB(VertSlang);
  47.     ShowMessage(glSlang_GetInfoLog(VertSlang));
  48.     glCompileShaderARB(FragSlang);
  49.     ShowMessage(glSlang_GetInfoLog(FragSlang));
  50.  
  51.     glAttachObjectARB(SlangProg,VertSlang);
  52.     glAttachObjectARB(SlangProg,FragSlang);
  53.  
  54.     glDeleteObjectARB(VertSlang);
  55.     glDeleteObjectARB(FragSlang);
  56.  
  57.     glLinkProgramARB(SlangProg);
  58.     ShowMessage(glSlang_GetInfoLog(SlangProg));
  59.  
  60.     glUseProgramObjectARB(SlangProg);
  61.  
  62.     ShowMessage(format('%d',[glGetHandleARB(GL_PROGRAM_OBJECT_ARB)]));
  63.  
  64.   end else begin
  65.   // Alternativ wird hier ein Fragment Program genutzt, falls FUseSlang auf False gesetzt ist.
  66.   end;
  67. end;
  68.  

Der Aufruf glGetHandleARB(GL_PROGRAM_OBJECT_ARB) liefert mir erwartungsgemäss eine 1 zurück.

in der folgenden Prozedur funktioniert es nicht (weder mit GLSL_FRAG_COLORMAP noch mit GLSL_FRAG_SHADERMAP)
Code:
  1.  
  2. procedure TVolumeViewer.AssignData(var _d : array of Single; _DimsX, _DimsY, _DimsZ : Integer; _GLTexType : Cardinal);
  3. var
  4.   VertSlang  : GLHandleARB;
  5.   FragSlang  : GLHandleARB;
  6.   VertLength : Integer;
  7.   FragLength : Integer;
  8. begin
  9.   EnableCube := True;
  10.  
  11.   Dimensions['x'] := _DimsX;
  12.   Dimensions['y'] := _DimsY;
  13.   Dimensions['z'] := _DimsZ;
  14.  
  15.   MaxDim := max(_DimsX,max(_DimsY,_DimsZ));
  16.  
  17.   // Resize Surrounding Volume
  18.   SetCube(_DimsX/MaxDim,_DimsY/MaxDim,_DimsZ/MaxDim);
  19.  
  20.   GLTexType := _GLTexType;
  21.  
  22.   ActivateRenderingContext(DC,RC,false);
  23.  
  24.   Assert(TextureSizeSupported(),'Texture too large or TexSize not Power of 2');
  25.  
  26.   // Set Default number of slices
  27.   if Slices = 0 then
  28.     Slices := 2*ceil(sqrt(Dimensions['x']*Dimensions['x']+Dimensions['y']*Dimensions['y']+Dimensions['z']*Dimensions['z']));
  29.  
  30.   // Set Texture Parameters and Texture
  31.   if @glTexImage3D = nil then begin
  32.     glGenTextures(1,@TexData);
  33.     glActiveTexture(GL_TEXTURE0);
  34.     glEnable(GL_TEXTURE_3D_EXT);
  35.     glBindTexture(GL_TEXTURE_3D_EXT, TexData);
  36.     glTexParameteri(GL_TEXTURE_3D_EXT,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  37.     glTexParameteri(GL_TEXTURE_3D_EXT,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  38.     glTexParameteri(GL_TEXTURE_3D_EXT,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
  39.     glTexParameteri(GL_TEXTURE_3D_EXT,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
  40.     glTexParameteri(GL_TEXTURE_3D_EXT,GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
  41.     glTexImage3DEXT(GL_TEXTURE_3D_EXT,0,GLTexType,Dimensions['x'],Dimensions['y'],Dimensions['z'],0,GLTexType,GL_FLOAT,PGLFloat(@_d));
  42.     glDisable(GL_TEXTURE_3D_EXT);
  43.   end else begin
  44.     glGenTextures(1,@TexData);
  45.     glActiveTexture(GL_TEXTURE0);
  46.     glEnable(GL_TEXTURE_3D);
  47.     glBindTexture(GL_TEXTURE_3D, TexData);
  48.     glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  49.     glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  50.     glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
  51.     glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
  52.     glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
  53.     glTexImage3D(GL_TEXTURE_3D,0,GLTexType,Dimensions['x'],Dimensions['y'],Dimensions['z'],0,GLTexType,GL_FLOAT,PGLFloat(@_d));
  54.     glDisable(GL_TEXTURE_3D);
  55.   end;
  56.  
  57.   FTexture := True;
  58.  
  59.   if FShading then begin
  60.     SlangProg := glCreateProgramObjectARB();
  61.  
  62.     VertSlang := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  63.     FragSlang := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  64.  
  65.     VertLength := Length(GLSL_VERT_COORDINATE);
  66.     FragLength := Length(GLSL_FRAG_SHADERMAP);
  67.  
  68.     glShaderSourceARB(VertSlang,1,@GLSL_VERT_COORDINATE,@VertLength);
  69.     glShaderSourceARB(FragSlang,1,@GLSL_FRAG_SHADERMAP,@FragLength);
  70.  
  71.     glCompileShaderARB(VertSlang);
  72.     ShowMessage(glSlang_GetInfoLog(VertSlang));
  73.     glCompileShaderARB(FragSlang);
  74.     ShowMessage(glSlang_GetInfoLog(FragSlang));
  75.  
  76.     glAttachObjectARB(SlangProg,VertSlang);
  77.     glAttachObjectARB(SlangProg,FragSlang);
  78.  
  79.     glLinkProgramARB(SlangProg);
  80.     ShowMessage(glSlang_GetInfoLog(SlangProg));
  81.  
  82.     glDeleteObjectARB(VertSlang);
  83.     glDeleteObjectARB(FragSlang);
  84.  
  85.     glUseProgramObjectARB(SlangProg);
  86.     if glGetError() = GL_INVALID_OPERATION then
  87.       ShowMessage('Invalid Operation');
  88.     ShowMessage(format('%d',[glGetHandleARB(GL_PROGRAM_OBJECT_ARB)]));
  89.   end;
  90. end;
  91.  

Hier bekomme ich mit dem gleichen Aufruf eine 0. Obwohl eigentlich nix anders ist. Oder seh ich jetzt den Wald vor lauter Bäumen nicht mehr?

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 11:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hast du schon mal versucht den Fehler häufiger abzufragen? Also das Stück mit glGetError in eine Procedure und dann zwischen jede Zeile. Also so, dass du genau sehen kannst wann der fehler denn genau auftritt. Evtl liegt er ja nur ganz wo anders und wird erst nur dann bemerkt.

Ist das Ergebnis was du erhält denn eigentlich korrekt oder wird auch nichts dargestellt?

Eine Anmerkung am Rande. Das mit den Texturen kann du auch einfacher haben. GL_TEXTURE_3D und GL_TEXTURE_3D_EXT haben beide ein und den selben Wert. Sind also auch für OpenGL ein und das Selbe. GL_TEXTURE_3D wird seit OpenGL 1.2 im Core unterstützt. Sollte es aber nicht unterstützt werden so setzt du GL_EXT_texture3D stillschweigend vorraus. Ich denke es wäre besser wenn du überprüfst ob OpenGL > 1.2 ist oder ob die Extension unterstützt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 11:31 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Letztlich mache ich die Fehlerabfrage mit GLIntercept v0.42 und der sagt mir explizit, das der Fehler von glUseProgramObjectARB aufgerufen wird.

Ich habe das ganze nochmal ein wenig modifiziert:
Das Laden/Linken der Shader steht jetzt in einer eigenen Prozedur

Code:
  1.  
  2. procedure TVolumeViewer.LoadShader(var Shader : GLHandleARB; COLORMAP: Boolean);
  3. var
  4.   VertSlang,
  5.   FragSlang : GLHandleARB;
  6.   VertLength,
  7.   FragLength : Integer;
  8. begin
  9.   ActivateRenderingContext(DC,RC,true);
  10.  
  11.   if Shader <> 0 then
  12.     glDeleteObjectARB(Shader);    
  13.  
  14.   Shader := glCreateProgramObjectARB();
  15.   VertSlang := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  16.   FragSlang := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  17.  
  18.   VertLength := Length(GLSL_VERT_COORDINATE);
  19.   if COLORMAP then
  20.     FragLength := Length(GLSL_FRAG_COLORMAP)
  21.   else
  22.     FragLength := Length(GLSL_FRAG_SHADERMAP);
  23.  
  24.   glShaderSourceARB(VertSlang,1,@GLSL_VERT_COORDINATE,@VertLength);
  25.  
  26.   if COLORMAP then
  27.     glShaderSourceARB(FragSlang,1,@GLSL_FRAG_COLORMAP,@FragLength)
  28.   else
  29.     glShaderSourceARB(FragSlang,1,@GLSL_FRAG_SHADERMAP,@FragLength);
  30.  
  31.   glCompileShaderARB(VertSlang);
  32.   ShowMessage(glSlang_GetInfoLog(VertSlang));
  33.   glCompileShaderARB(FragSlang);
  34.   ShowMessage(glSlang_GetInfoLog(FragSlang));
  35.  
  36.   glAttachObjectARB(Shader,VertSlang);
  37.   glAttachObjectARB(Shader,FragSlang);
  38.  
  39.   glDeleteObjectARB(VertSlang);
  40.   glDeleteObjectARB(FragSlang);
  41.  
  42.   glLinkProgramARB(Shader);
  43.   ShowMessage(glSlang_GetInfoLog(Shader));
  44.  
  45.   glUseProgramObjectARB(Shader);
  46. end;
  47.  


und in meiner OnRender-Routine findet sich jetzt nur noch das glUseProgramObjectARB.
Geladen werden die Shader wie vorher in AssignData bzw. AssignColormap.


Hier die Render Routine (gekürzt wo möglich)
Code:
  1.  
  2. procedure TVolumeViewer.Render();
  3. var
  4.   CM : array[0..15] of Single;
  5.   MV : array[0..15] of Single;
  6. begin
  7.   ActivateRenderingContext(DC,RC,false);
  8.   SetupContext();
  9.  
  10.   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  11.  
  12.   case FBlendMode of
  13.   // BlendFunc, BlendEquation und GL_BLEND setzen
  14.   end;
  15.  
  16.   // Rotate
  17.   glRotatef(Rot[0],1,0,0);
  18.   glRotatef(Rot[1],0,1,0);
  19.   glRotatef(Rot[2],0,0,1);
  20.   // Move to draw centered
  21.   glTranslatef(-VV_Cube_Corners[6,0]/2,-VV_Cube_Corners[6,1]/2,-VV_Cube_Corners[6,2]/2);
  22.  
  23.   if FTexture then begin
  24.     glActiveTexture(GL_TEXTURE0);
  25.  
  26.     if @glTexImage3D <> nil then
  27.       glBindTexture(GL_TEXTURE_3D,TexData)
  28.     else
  29.       glBindTexture(GL_TEXTURE_3D_EXT,TexData);
  30.  
  31.     // Automatic Texture Coordinate Generation
  32.     glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  33.     glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  34.     glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
  35.     glTexGenfv(GL_S, GL_EYE_PLANE, PGLFloat(@VV_XVEC));
  36.     glTexGenfv(GL_T, GL_EYE_PLANE, PGLFloat(@VV_YVEC));
  37.     glTexGenfv(GL_R, GL_EYE_PLANE, PGLFloat(@VV_ZVEC));
  38.     glEnable  (GL_TEXTURE_GEN_S);
  39.     glEnable  (GL_TEXTURE_GEN_T);
  40.     glEnable  (GL_TEXTURE_GEN_R);
  41.  
  42.     // Enable Alpha-Blending and Texture Modulation
  43.  
  44.     case FTexFunc of
  45.       // Abfrage der versch. Texture Modi
  46.     else
  47.       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
  48.     end;
  49.  
  50.     case FAlphaFunc of
  51.       // Alpha-Func Abfragen
  52.     else
  53.       glAlphaFunc(GL_GEQUAL,(Isoval-FMin)/FMax);
  54.     end;
  55.     glEnable(GL_ALPHA_TEST);
  56.  
  57.     if @glTexImage3D <> nil then
  58.         glEnable(GL_TEXTURE_3D)
  59.     else
  60.         glEnable(GL_TEXTURE_3D_EXT);
  61.  
  62. // ---------------------------------------
  63. // Wichtiger Teil
  64. // ---------------------------------------
  65.  
  66.  
  67.     if FShading then begin
  68.       glMatrixMode(GL_MODELVIEW);
  69.       glGetFloatv(GL_MODELVIEW_MATRIX,PGLFloat(@MV));
  70.       // Light Direction -> LightSource = Camera Position
  71.       CM[ 0] := -CameraX;
  72.       CM[ 1] := -CameraX;
  73.       CM[ 2] := -CameraX;
  74.       CM[ 3] := 0;
  75.       CM[ 4] := -CameraY;
  76.       CM[ 5] := -CameraY;
  77.       CM[ 6] := -CameraY;
  78.       CM[ 7] := 0;
  79.       CM[ 8] := -CameraZ;
  80.       CM[ 9] := -CameraZ;
  81.       CM[10] := -CameraZ;
  82.       CM[11] := 0;
  83.       CM[12] := 0;
  84.       CM[13] := 0;
  85.       CM[14] := 0;
  86.       CM[15] := 1;
  87.  
  88.       MV[ 3] := 0;
  89.       MV[ 7] := 0;
  90.       MV[11] := 0;
  91.       MV[12] := 0;
  92.       MV[13] := 0;
  93.       MV[14] := 0;
  94.       MV[15] := 1;
  95.  
  96.       glPushMatrix();
  97.       glLoadIdentity();
  98.       glMultMatrixf(PGLFloat(@CM));
  99.       glGetFloatv(GL_MODELVIEW_MATRIX,PGLFloat(@CM));
  100.       glMultMatrixf(PGLFloat(@MV));
  101.       glGetFloatv(GL_MODELVIEW_MATRIX,PGLFloat(@CM));      
  102.  
  103.       CM[ 0] := 2;
  104.       CM[ 1] := 0;
  105.       CM[ 2] := 0;
  106.       CM[ 3] := 0;
  107.       CM[ 4] := 0;
  108.       CM[ 5] := 2;
  109.       CM[ 6] := 0;
  110.       CM[ 7] := 0;
  111.       CM[ 8] := 0;
  112.       CM[ 9] := 0;
  113.       CM[10] := 2;
  114.       CM[11] := 0;
  115.       CM[12] := -1;
  116.       CM[13] := -1;
  117.       CM[14] := -1;
  118.       CM[15] := 1;
  119.  
  120.       glMultMatrixf(PGLFloat(@CM));
  121.       glGetFloatv(GL_MODELVIEW_MATRIX,PGLFloat(@CM));
  122.  
  123.       glPopMatrix();
  124.  
  125. // Hiernach kommt der Fehler
  126.       glUseProgramObjectARB(SlangProg);      
  127.  
  128. // Gaaanz viele Folgefehler
  129.       glUniform1iARB(glGetUniformLocationARB(SlangProg,PGLCharARB('DataTexture')),0);
  130.       glUniformMatrix4fvARB(glGetUniformLocationARB(SlangProg,PGLCharARB('CM')),16,false,PGLFloat(@CM));
  131.       glUniform4fARB(glGetUniformLocationARB(SlangProg,PGLCharARB('kd')),1.0,1.0,1.0,1.0);
  132.       glUniform4fARB(glGetUniformLocationARB(SlangProg,PGLCharARB('Ia')),0.0,0.0,0.0,0.0);
  133.     end;
  134.  
  135.     if FColorMap then begin
  136.       glActiveTexture(GL_TEXTURE1);
  137.       glBindTexture(GL_TEXTURE_1D,TexColorMap);
  138.       glEnable(GL_TEXTURE_1D);
  139.       if FUseSlang then begin
  140. // Hier kommt komischerweise kein Fehler
  141.         glUseProgramObjectARB(SlangProg);
  142.  
  143.         glUniform1iARB(glGetUniformLocationARB(SlangProg,PGLCharARB('DataTexture')),0);
  144.         glUniform1iARB(glGetUniformLocationARB(SlangProg,PGLCharARB('MyColorMap')),1);
  145.       end else begin
  146.         glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB,FragProg);
  147.         glEnable(GL_FRAGMENT_PROGRAM_ARB);
  148.       end;
  149.     end;
  150.  
  151. // Würfel zeichnen
  152.     DrawSlices(Slices);
  153.   end;
  154.  
  155.   // Restore Defaults
  156.   glDisable(GL_ALPHA_TEST);
  157.   glDisable(GL_BLEND);
  158.   glDisable(GL_TEXTURE_1D);
  159.   if @glTexImage3D <> nil then
  160.     glDisable(GL_TEXTURE_3D)
  161.   else
  162.     glDisable(GL_TEXTURE_3D_EXT);
  163.   glDisable(GL_TEXTURE_GEN_S);
  164.   glDisable(GL_TEXTURE_GEN_T);
  165.   glDisable(GL_TEXTURE_GEN_R);
  166.  
  167.   if FColorMap then
  168.     if FUseSlang then
  169.       glUseProgramObjectARB(0)
  170.     else
  171.       glDisable(GL_FRAGMENT_PROGRAM_ARB);
  172.  
  173.   if FShading then
  174.     glUseProgramObjectARB(0);
  175.  
  176.   if EnableCube then
  177.     DrawCube();
  178.   if FDrawMark then
  179.     DrawMarker();
  180.  
  181.   SwapBuffers(DC);
  182. end;
  183.  


Mein Ergebnis ist leider falsch, sofern ich FShading einschalte. mit FColorMap ist es korrekt. Aber da bekomme ich auch keine Fehler.

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also wegen dem glUseProgramObjectARB muss ich passen. Für mich sieht es in Ordnung aus aber ich kenne mich damit auch nicht so super aus. Liefert dir glSlang_GetInfoLog(Shader) eigentlich einen Text, wenn das Benutzen des Shaders nicht geklappt hat?

Ich denke aber auch mal, dass glUseProgramObjectARB(SlangProg); nur ein Übertragungsfehler ist. Denn eigentlich sollte das ja bestimmt Shader heißen.


3D Textur: Auch auf die Gefahr hin, dass ich mich unglücklich mache.

Anstelle von
Code:
  1.   if @glTexImage3D <> nil then
  2.     glEnable(GL_TEXTURE_3D)
  3.   else
  4.     glEnable(GL_TEXTURE_3D_EXT);

kannst du auch vollgendes schreiben.
Code:
  1.   if @glTexImage3D <> nil then
  2.     glEnable(GL_TEXTURE_3D)
  3.   else
  4.     glEnable(GL_TEXTURE_3D);

Und damit könntest du es auch auf glEnable(GL_TEXTURE_3D); beschränken. Das hat den gleichen Effekt, da GL_TEXTURE_3D = GL_TEXTURE_3D_EXT ist. Die beiden Extensions unterscheiden sich lediglich im Namen und der Variable in der ihre Funktionspointer abgelegt werden. Ich würde sogar fast Wetten, dass die Funktionspointer die Gleichen sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 12:39 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Lossy eX hat geschrieben:
Und damit könntest du es auch auf glEnable(GL_TEXTURE_3D); beschränken. Das hat den gleichen Effekt, da GL_TEXTURE_3D = GL_TEXTURE_3D_EXT ist. Die beiden Extensions unterscheiden sich lediglich im Namen und der Variable in der ihre Funktionspointer abgelegt werden. Ich würde sogar fast Wetten, dass die Funktionspointer die Gleichen sind.


Im Prinzip hast Du Recht. Nur bevor ich die jetzige Grafikkarte bekommen habe (GF6600) lief das ganze (ok es kroch...) auf nem OnBoard Grafikchipsatz. (Müßte eigentlich Intel SiS gewesen sein. - Weiß schon nicht mehr)
Der hat sich mit OpenGL 1.2 kompatibel gemeldet, kannte aber die GL_TEXTURE_3D nicht. Von daher ist die Abfrage da noch drin...
Ist leider nicht alles so heile in der OpenGL-Welt wie man sich das manchmal wünschen würde. Noch ein Beispiel? Such mal auf ner ATI 9x00 nach GL_IMAGING-Subset. Gibts auf den Apple Karten, aber für Windows gibts das nicht. Obwohl es seit OpenGL 1.2 eigentlich Standard sein sollte...

Habe eben den ganzen Kram gelöscht (zumindest den Shader Teil) und baue das nochmal neu. Vielleicht habe ich ja irgendwo einfach was übersehen.

Danke für die Hilfe.

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 20, 2005 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
GL_TEXTURE_3D und GL_TEXTURE_3D_EXT sind allerdings 2 constanten, die beide den selben Wert ($806F) haben. Insofern sollte es vollkommen egal sein, welchen der beiden Werte man einsetzt. Entweder die Graka kann 3D texturen, dann ist es egal welchen der beiden man einsetzt, oder sie kann es nicht, dann funktionieren aber beide nicht.

Durch den Programmcode wollte ich mich jetzt nich wühlen, hättest du nicht die benötigten Dateien hochladen können, dass man mal testen könnte? so auf den ersten Blick find ich das jedenfalls nicht ersichtlich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 21, 2005 11:12 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Das Problem hat sich auf wundersame Weise gelöst. Nachdem ich das alles nochmal neu geschrieben habe, funktioniert es jetzt. Warum auch immer.
EDV = Ende der Vernunft

3D Textures
Hm, ok. Überzeugt. Sind tatsächlich die gleichen Konstanten. Dann brauche ich die Abfrage nur noch bei,

Code:
  1.  
  2. if @glTexImage3D = nil then
  3.       glTexImage3DExt([...])
  4.     else
  5.       glTexImage3D   ([...]);
  6.  


Bedankt.

Zu den benötigten Dateien gehören (leider) ein paar Komponenten, ein kleines Framework aussen drum sowie mindestens ein Datensatz. Und allein der ist schon 16MB groß.
Sonst gerne die Dateien, aber da das so schlecht zu trennen ist, indem Fall lieber den Quellcode.

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


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


Wer ist online?

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