Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   OpenGL Texture -Problem (https://www.delphipraxis.net/158988-opengl-texture-problem.html)

ich2 10. Mär 2011 11:09

OpenGL Texture -Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen...

Habe da ein kleines Problem mit Texturen in OpenGL.
Die Texturen werden geladen, aber dennoch nicht angezeigt...
vielleicht habe ich ja was übersehen...

also zuerst die ganzen Parameter initialisieren
Delphi-Quellcode:
function Init_OpenGL ( _handle: THandle; _width, _height: Word ): Boolean;
var
  TMUs: Integer;
begin

  try
    // init the camera
    Camera := Init_3D_TRS;
    Camera._tx := 0;
    Camera._ty := -0.7;
    Camera._tz := -7;

    // Setup OpenGL
    DC := GetDC ( _handle );
    RC := CreateRenderingContext ( DC,
                                   [ opDoubleBuffered ],
                                   32,                        // ColorBits
                                   24,                        // ZBits
                                   0,                         // StencilBits
                                   0,                         // AccumBits
                                   0,                         // AuxBuffer
                                   0 );                       // Layer
    ActivateRenderingContext ( DC, RC );

    // Check, if the GFX-Card supports Multitexturing
    glGetIntegerv ( GL_MAX_TEXTURE_UNITS, @TMUs );
    if TMUs < 2 then begin
      console ( 'no support for multitexturing' );
    end;

    // Enable 2D Textures
    glEnable ( GL_TEXTURE_2D );
    // Enable Depth Test
    glEnable ( GL_DEPTH_TEST );
    // Depth Buffer Setup
    glClearDepth ( 1.0 );
    // Set Detph Function
    glDepthFunc ( GL_LEQUAL );
    // Qualitativ bessere Koordinaten Interpolation
    glHint ( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

    // Set Clear Color = black
    glClearColor ( 0, 0, 0, 0 );

    // set screen-size
    Resize_OpenGL ( _width, _height );

    // create font
    CreateFont ( 0.01 );

    // clean the texture-puffer
    Init_Textures;

    // create Quadric
    MySphere := gluNewQuadric();

    // Set OpenGL initialized
    OpenGL_Initialized := true;
    result := true;
  except
    OpenGL_Initialized := false;
    result := false;
    exit;
  end;
end; // <- Init_OpenGL
Delphi-Quellcode:
function Init_Textures: Boolean;
var
  Counter: Word;
begin
  try
    // init the texture-puffer
    for Counter := 1 to TEXTURESMAX do
      if Textures [ Counter ] <> nil then begin
        Textures [ Counter ].Free;
        Textures [ Counter ] := nil;
      end;

    result := true;
  except
    result := false;
    exit;
  end;
end; // <- Init_Textures
Das Array Textures sieht folgendermaßen aus...

Delphi-Quellcode:
textures: array [ 1..TEXTURESMAX ] of TGLBmp;
Dann werden mal ein paar Texturen geladen...(alles 512x512 jpg-files)

Delphi-Quellcode:
  Load_Texture ( textures [ 1 ], EPath + '\media\yx_values_13080Hz_abs.bin.jpg' );//, true, true );
  Load_Texture ( textures [ 2 ], EPath + '\media\yz_values_13080Hz_abs.bin.jpg' );//, true, true );
  Load_Texture ( textures [ 3 ], EPath + '\media\zx_values_13080Hz_abs.bin.jpg' );//, true, true );

  Load_Texture ( textures [ 4 ], EPath + '\media\yx_values_13080Hz_im.bin.jpg' );//, true, true );
  Load_Texture ( textures [ 5 ], EPath + '\media\yz_values_13080Hz_im.bin.jpg' );//, true, true );
  Load_Texture ( textures [ 6 ], EPath + '\media\zx_values_13080Hz_im.bin.jpg' );//, true, true );

  Load_Texture ( textures [ 7 ], EPath + '\media\yx_values_13080Hz_re.bin.jpg' );//, true, true );
  Load_Texture ( textures [ 8 ], EPath + '\media\yz_values_13080Hz_re.bin.jpg' );//, true, true );
  Load_Texture ( textures [ 9 ], EPath + '\media\zx_values_13080Hz_re.bin.jpg' );//, true, true );
das Load_Texture sieht so aus:

Delphi-Quellcode:
function Load_Texture ( var _tex: TGLBmp; _filename: String; _s3tc: Boolean = false; _ani: Boolean = false ): Boolean; overload;
begin
  try
    if _tex <> nil then
      _tex.Free;

    _tex := TGLBmp.Create ( _filename );
    _tex.GenTexture ( _s3tc, _ani );

    result := true;
  except
    result := false;
    exit;
  end;
end; // <- Load_Texture
TGLBmp.Create ( _filename ); ...sollte funktionieren...da macht er nichts anderes als die texturedaten einlesen
GenTexture (); ...ist eigentlich auch fertig und sollte tun...aber naja...

Delphi-Quellcode:
procedure TGLBMP.GenTexture(pS3TC, pAni : Boolean);
var
 MaxAnisotropy : TGLUInt;
begin
  if Assigned(rgbBits) then begin
    // If a texture object has already been created, delete it
    if TextureID > 0 then
      glDeleteTextures(1, @TextureID);

    // Create a new OpenGL texture object
    glGenTextures(1, @TextureID);
    glBindTexture(GL_TEXTURE_2D, TextureID);

    // Set up parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texWrapS);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texWrapT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);

    // Zusatz : Anisotropisches Filtern
{!} if pAni then
{!}  begin
{!}  glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, @MaxAnisotropy);
{!}  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, MaxAnisotropy);
{!}  end
{!} else
{!}  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0);
    // MipMaps generieren, wenn möglich im komprimierten S3TC-Format
{!} if pS3TC then
{!}  gluBuild2DMipmaps(GL_TEXTURE_2D, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, PByte(rgbBits))
{!} else
{!}  gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, PByte(rgbBits))
  end;
end;
...so zu guter letzt die Renderei...
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not begin_Render then exit;

  // Switch to 2D mode
  OpenGL_2D;

//  Show_Line2D ( Vector2D ( 1, 1 ), Vector2D ( 200, 10 ), FloatColorAlpha ( 0, 0, 1, 1 ) );


  // Switch to 3D mode
  OpenGL_3D;
  inc ( count );

  set_globalambient ( 0.5, 0.5, 0.5, 1 );


  Show_TexturedQuad3D ( Get_3D_TRS ( 0, 0, 0, 0, 0, 0, 2, 2, 2 ),
                        FloatColorAlpha ( 1, 1, 1, 0.7 ), 3*textureindex-2 );
  Show_TexturedQuad3D ( Get_3D_TRS ( 0, 0, 0, 0, 90, 0, 2, 2, 2 ),
                        FloatColorAlpha ( 1, 1, 1, 0.7 ), 3*textureindex-1 );
  Show_TexturedQuad3D ( Get_3D_TRS ( 0, 0, 0, 90, 0, 0, 2, 2, 2 ),
                        FloatColorAlpha ( 1, 1, 1, 0.7 ), 3*textureindex-0 );



  end_Render;
end;
Delphi-Quellcode:
function begin_Render: Boolean;
begin
  if not OpenGL_Initialized then begin
    result := false;
    exit
  end;

  // Clearscreen
  glClear ( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
  glViewport ( 0, 0, Screen_Width, Screen_Height );
  glMatrixMode ( GL_MODELVIEW );
  glLoadIdentity;

  // set to camera-view
  Compute_Camera;

  result := true;
end; // <- begin_Render

procedure OpenGL_2D;
begin
  glMatrixMode ( GL_PROJECTION );
  glPushMatrix ();                                     // Store The Projection Matrix
  glLoadIdentity ();                                   // Reset The Projection Matrix
  glOrtho ( 0, Screen_width, 0, Screen_height, -1, 1 ); // Set Up An Ortho Screen
  glMatrixMode ( GL_MODELVIEW );
  glPushMatrix ();                                     // Store old Modelview Matrix
  glLoadIdentity (); // Reset The Modelview Matrix
end; // <- go2d

procedure OpenGL_3D;
begin
  glMatrixMode ( GL_PROJECTION );
  glPopMatrix ();                // Restore old Projection Matrix
  glMatrixMode ( GL_MODELVIEW );
  glPopMatrix ();                // Restore old Projection Matrix
end; // <- exit2d

procedure end_Render;
begin
  // Redraw screen
  SwapBuffers ( dc );
end; // <- end_Render

procedure Show_TexturedQuad3D ( _3D_TRS: T3D_TRS;
                                Color: TFloatColorAlpha;
                                _tex_Index: Word ); overload;
begin
  if _tex_Index < 1 then
    Show_TexturedQuad3D ( _3D_TRS, Color, nil )
  else
    Show_TexturedQuad3D ( _3D_TRS, Color, Textures [ _tex_Index ] );
end; // <- Show_TexturedQuad3D

procedure Show_TexturedQuad3D ( _3D_TRS: T3D_TRS;
                                Color: TFloatColorAlpha;
                                _tex: TGLBmp ); overload;
var
  C1, C2, C3, C4: TVector3D;
begin
  C1 := Vector3D ( -1, 1, 0 );
  C2 := Vector3D (  1, 1, 0 );
  C3 := Vector3D (  1, -1, 0 );
  C4 := Vector3D ( -1, -1, 0 );

  glEnable ( GL_BLEND );
  glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

  glPushMatrix;

  glTranslatef ( _3D_TRS._tx, _3D_TRS._ty, _3D_TRS._tz );

  glRotatef ( _3D_TRS._rx, 1, 0, 0 );
  glRotatef ( _3D_TRS._ry, 0, 1, 0 );
  glRotatef ( _3D_TRS._rz, 0, 0, 1 );

  glScalef ( _3D_TRS._sx, _3D_TRS._sy, _3D_TRS._sz );

  if _tex <> nil then
    _tex.Bind
  else
    glBindTexture ( GL_TEXTURE_2D, 0 );
 
  glcolor4f ( Color.r, Color.g, Color.b, Color.a );

  glbegin ( GL_QUADS );
    glTexCoord2f ( 0, 1 );
    glvertex3f ( C1.x, C1.y, C1.z );
    glTexCoord2f ( 1, 1 );
    glvertex3f ( C2.x, C2.y, C2.z );
    glTexCoord2f ( 1, 0 );
    glvertex3f ( C3.x, C3.y, C3.z );
    glTexCoord2f ( 0, 0 );
    glvertex3f ( C4.x, C4.y, C4.z );
  glend;

  glPopMatrix;

  glDisable ( GL_BLEND );
end; // <- Show_TexturedQuad3D
...so weit so gut...

grüße

ich2 10. Mär 2011 11:39

AW: OpenGL Texture -Problem
 
...Fehler behoben...

habe mir ne aktuellere Version der glBMP.pas und der dglOpenGL.pas gezogen...
ein wenig den Quellcode angepaßt und siehe da...

läuft

grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz