Lazarus OpenGl i wczytywanie tekstur z pliku

0

Mam pytanie jak wczytać teksturę z pliku (np. bmp) w lazarusie. Czytałem tutorial z tej strony (http://4programmers.net/delphi/opengl#id-Kostka-3D) ale w lazarusie nie ma unitu textures. W tutorialu lazarusa jest że trzeba ściągać dodatkowe biblioteki czego robić nie chce bo piszę grę (a właściwie napisałem tylko grafika potrzebna) i chciałbym na niej trochę zarobić a w licencji tych dodatkowych bibliotek jest podpunkt że jeśli się je wykorzysta to trzeba udostępnić kod źródłowy. Czy muszę pisac własnego loadera czy jest jakiś prosty sposób?

0

a w licencji tych dodatkowych bibliotek jest podpunkt że jeśli się je wykorzysta to trzeba udostępnić kod źródłowy
I jakie to niby biblioteki?
Jeśli licencja jest GPL, to jeśli biblioteka jest dynamiczna (w osobnym pliku dll) to nie trzeba się przejmować.

0

licencja GPL ale biblioteki nie są w dll. http://imaginglib.sourceforge.net/

1

piszę grę (a właściwie napisałem tylko grafika potrzebna)

Nie no serio, i ty nam tutaj że grę piszesz?

babubabu napisał(a):

licencja GPL ale biblioteki nie są w dll. http://imaginglib.sourceforge.net/

Nie żadne GPL ale LGPL lub MPL.

W tutorialu lazarusa jest że trzeba ściągać dodatkowe biblioteki czego robić nie chce bo piszę grę

No to napisz swoje. Zresztą tam są podane jedne, pewnie jest ich więcej.

chciałbym na niej trochę zarobić

Na pewno kupę kasy na niej zarobisz.

Czy muszę pisac własnego loadera czy jest jakiś prosty sposób?

Jaki loader?!? WTF

Jeśli licencja jest GPL, to jeśli biblioteka jest dynamiczna (w osobnym pliku dll) to nie trzeba się przejmować.

A co jak napiszę sobię prosty wrapper który będzie ładowany przez mój exek? Wtedy też wystarczy opublikować kod dllki? no to problem rozwiązany.

0

Masz jakiś problem z tym, że ja piszę grę? Mój czas moja sprawa a skoro uważasz, że marnuje Twój zadając pytanie to nie odpowiadaj albo w ogole nie czytaj forum zaoszczędzisz trochę swojego czasu.

-123oho napisał(a):

No to napisz swoje. Zresztą tam są podane jedne, pewnie jest ich więcej.

Po to zadałem pytanie żeby dowiedzieć się czy muszę pisać swoje czy może ktoś zna jakieś do użytku komercyjnego bo ja na razie znajduje tylko takie których nie można używać komercyjnie, lub trzeba kupić licencję.

-123oho napisał(a):

Na pewno kupę kasy na niej zarobisz.

Jak się uda to fajnie. A jak nie to trudno. Bardziej piszę dla swojej satysfakcji a jak się da na tym zarobić to też fajnie. Zresztą to również nie Twój problem.

0

Masz jakiś problem z tym, że ja piszę grę? Mój czas moja sprawa a skoro uważasz, że marnuje Twój zadając pytanie to nie odpowiadaj albo w ogole nie czytaj forum zaoszczędzisz trochę swojego czasu.

Problem jest taki że ty tej gry w ogóle nie masz. I nie wiem gdzie napisałem że marnujesz mój czas. Raczej twoje pytania są dosyć bezsensowne, bo sam nie wiesz czego chcesz (co można wywnioskować po tym że nie ustosunkowałeś się do konstruktywnej części mojego posta).

Po to zadałem pytanie żeby dowiedzieć się czy muszę pisać swoje czy może ktoś zna jakieś do użytku komercyjnego bo ja na razie znajduje tylko takie których nie można używać komercyjnie, lub trzeba kupić licencję.

No to skoro chcesz zarabiać to czas zainwestować.

Jak się uda to fajnie. A jak nie to trudno. Bardziej piszę dla swojej satysfakcji a jak się da na tym zarobić to też fajnie. Zresztą to również nie Twój problem.

Ja ci po prostu pokazuje że nic na tym nie zarobisz i martwisz się na zapas. Zapewne ta gra w ogóle do skutku nie dojdzie.

0

No to Cię rozczaruję bo gre mam działającą tylko jest kilka niedociągnięć:

  1. Grafika jest archaicznie obsługiwana przez procesor co daje mi około 1 klatki na 10 sekund dlatego chce to wrzucić w opengl.
  2. Nie mam grafiki w postaci bitmap więc wszystko działa na bitmapach z napisem (muszę po prostu narysować).
  3. Kilka niedociągnięć przy przesyłaniu danych przez sieć.
  4. Brak obsługi myszki.
  5. Parę innych błędów ale nie pamiętam dokładnie jakich, bym musiał kod przejrzeć a jest tego koło 2500 linii więc średnio mi się chce przeglądać kod tylko po to by udowodnić Ci że nie jestem wielbłądem.

Jak jesteś zainteresowany co to za gra to jest to przeniesienie gry planszowej do wirtualnego swiata (instrukcja do gry http://instrukcja.pl/i/gra_manewry_morskie). Chcesz zobaczyć co napisałem to napisz, wrzucę na jakiś serwer typu fileserver i dam link do pobrania.

1
babubabu napisał(a):
  1. Grafika jest archaicznie obsługiwana przez procesor co daje mi około 1 klatki na 10 sekund dlatego chce to wrzucić w opengl.

Lol, kilkanaście lat temu gry wszystko liczyły na procesorze, Pentium MMX (efektywnie ze 100x mniej wydajny od aktualnych procesorów) był wystarczający do renderowania grafiki 3D z dynamicznym oświetleniem (Unreal). Naprawdę jesteś pewien, że wina leży w nieużywaniu OGL?

0

No nie koniecznie. Ale sami mi poleciliście wsadzenie tego w ogl :) (http://4programmers.net/Forum/Delphi_Pascal/195230-wczytywanie_pliku_bmp) więc się uczę ogl. I jedyny problem jaki mam to wczytanie tekstury. Znalazłem gdzieś w zakamarkach forum taki kod:

Unit texture;

Interface
Uses
  SysUtils, Windows, OpenGLContext, GLU, GL;
Type
  TImageData = Array of byte;

procedure LoadTexture( filename: PChar;  var texture: GLuint);

Implementation

function LoadBMP(FileName: PChar; var biFH: BITMAPINFOHEADER): TImageData;
var
  bFH: BITMAPFILEHEADER;
  fileHandle: integer;
  i: Cardinal;
  tempRGB: byte;
const
  BMPTYPE = 19778;
begin
  if not FileExists(Filename) then
  begin
    Result := nil;
    exit;
  end;
  fileHandle := FileOpen(FileName, fmOpenRead);
  FileRead (fileHandle, bFH, sizeof(BITMAPFILEHEADER));
  if bFH.bfType <> BMPTYPE then
  begin
    FileClose(fileHandle);
    Result := NIL;
    exit;
  end;
  FileRead(fileHandle, biFH, sizeof(BITMAPINFOHEADER));
  FileSeek(fileHandle, bFH.bfOffBits, 0);
  SetLength(result, biFH.biSizeImage);
  for i:=0 to biFH.biSizeImage-1 do
    FileRead(fileHandle, result[i], 1);
  i := 0;
  while (i < biFH.biSizeImage) do
  begin
    tempRGB := result[i];
    result[i] := result[i+2];
    result[i+2] := tempRGB;
    Inc(i,3);
  end;
  FileClose(fileHandle);
end;

procedure LoadTexture( filename: PChar;  var texture: GLuint);
var
  image: BITMAPINFOHEADER;
  buffor: TImageData;
begin
  buffor := LoadBMP(filename, image);
  if (Assigned(buffor)) then
  begin
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, image.biWidth, image.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, @buffor);
    glGenTextures(1, @texture);
    glBindTexture(GL_TEXTURE_2D, texture);
  end
  else
    MessageBox(HWND(nil), PAnsiChar('Nie udalo się załadować tekstury o nazwie: ' + filename + #10#13 +'Upewnij się czy podana jej lokalizacja jest prawidłowa' ), 'Informacja', MB_OK);
end;


end. 

w prawdzie był pod delphi ale trochę go przerobiłem i pod lazarusem się kompiluje ale nie wiem czy działa. A używam go tak:

 unit U_OpenGLNauka; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  OpenGLContext, GL, GLU, texture;

type

  { TForm1 }

  TForm1 = class(TForm)
    OpenGLControl1 : TOpenGLControl;
    procedure FormCreate(Sender: TObject);
    procedure OpenGLControl1Paint(Sender: TObject);
    procedure OpenGLControl1Resize(Sender: TObject);
    procedure OnAppIdle(Sender: TObject; var Done: Boolean);
  private
    { private declarations }
  public
    texture : glUint;
    { public declarations }
  end; 


var
  Form1: TForm1; 

implementation

{$R *.lfm}


procedure TForm1.OnAppIdle(Sender: TObject; var Done: Boolean);
begin
  Done:=false;
  OpenGLControl1.Invalidate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Sender=nil then ;

  OpenGLControl1:=TOpenGLControl.Create(Self);
  with OpenGLControl1 do begin
    Name:='OpenGLControl1';
    Align:=alClient;
    Parent:=Self;
    OnPaint:=@OpenGLControl1Paint;
    OnResize:=@OpenGLControl1Resize;
    AutoResizeViewport:=true;
  end;

  Application.AddOnIdleHandler(@OnAppIdle);
  LoadTexture ('obrazek.bmp',texture);
end;

procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity;
  glOrtho (0,Width,Height,0,0,0);
  glMatrixMode (GL_MODELVIEW);
  glDisable (GL_DEPTH_TEST);
  glClear (GL_COLOR_BUFFER_BIT);
  glEnable(GL_TEXTURE_2D);

  glClearColor (0,0,0,0);

  glBindTexture(GL_TEXTURE_2D, texture);
  glBegin (GL_QUADS);
    glTexCoord2f(1, 1); glVertex2f (0.9,0.9);
    glTexCoord2f(0, 1); glVertex2f (-0.9,0.9);
    glTexCoord2f(0, 0); glVertex2f (-0.9,-0.9);
    glTexCoord2f(1, 0); glVertex2f (0.9,-0.9);
  glEnd;

  OpenGLControl1.SwapBuffers;
end;

procedure TForm1.OpenGLControl1Resize(Sender: TObject);
begin
  if Sender=nil then ;
  if OpenGLControl1.Height <= 0 then exit;
end;

end.

Możliwe, że kod do wczytania tekstur jest poprawny tylko ja źle go wykorzystuję no ale cóż uczę się i nie wszystko od razu mi działa.

0
babubabu napisał(a):

No to Cię rozczaruję bo gre mam działającą tylko jest kilka niedociągnięć:

  1. Grafika jest archaicznie obsługiwana przez procesor co daje mi około 1 klatki na 10 sekund dlatego chce to wrzucić w opengl.
  2. Nie mam grafiki w postaci bitmap więc wszystko działa na bitmapach z napisem (muszę po prostu narysować).
  3. Kilka niedociągnięć przy przesyłaniu danych przez sieć.
  4. Brak obsługi myszki.
  5. Parę innych błędów ale nie pamiętam dokładnie jakich, bym musiał kod przejrzeć a jest tego koło 2500 linii więc średnio mi się chce przeglądać kod tylko po to by udowodnić Ci że nie jestem wielbłądem.

Jak jesteś zainteresowany co to za gra to jest to przeniesienie gry planszowej do wirtualnego swiata (instrukcja do gry http://instrukcja.pl/i/gra_manewry_morskie). Chcesz zobaczyć co napisałem to napisz, wrzucę na jakiś serwer typu fileserver i dam link do pobrania.

Nie jestem zainteresowany twoimi projektami.
Ale zrozumiałem że masz tylko grafikę, nie na odwrót. Tak to jest jak się po nocy czyta. Tylko nie zmienia to faktu że skoro masz grę, to czemu pytasz o grę?!?

No nie koniecznie. Ale sam mi poleciłeś wsadzenie tego w ogl (http://4programmers.net/Forum/[...]l/195230-wczytywanie_pliku_bmp).

Kto ci polecił? Bo chyba ja, nie ten "lol", czyż nie? Nicki czytać umiesz?

Lol, kilkanaście lat temu gry wszystko liczyły na procesorze, Pentium MMX (efektywnie ze 100x mniej wydajny od aktualnych procesorów) był wystarczający do renderowania grafiki 3D z dynamicznym oświetleniem (Unreal). Naprawdę jesteś pewien, że wina leży w nieużywaniu OGL?

Prawda, ale porównanie jest trochę nietrafione bo porównujesz nowicjusza z profesjonalistami. Zresztą, od czasów systemów Dosopodobnych trochę minęło i nie można już odwoływać się bezpośrednio do hardware. Im komputery mają większą moc tym programiści marnują więcej taktów.

Możliwe, że kod do wczytania tekstur jest poprawny tylko ja źle go wykorzystuję no ale cóż uczę się i nie wszystko od razu mi działa.

Chcesz mi powiedzieć że chcesz trzymać wszystkie pliki graficzne jako nieskompresowany BMP? No to powodzenia w zapychaniu dysku.

if Sender=nil then ;

Trolling or just stupid?

0
-123oho napisał(a):

Możliwe, że kod do wczytania tekstur jest poprawny tylko ja źle go wykorzystuję no ale cóż uczę się i nie wszystko od razu mi działa.

Chcesz mi powiedzieć że chcesz trzymać wszystkie pliki graficzne jako nieskompresowany BMP? No to powodzenia w zapychaniu dysku.

Nie. Che najpierw zrobić coś co w ogóle działa a potem to udoskonalać. jak nie chcesz pomóc to nie pomagaj i daj się wypowiedzieć innym którzy ewentualnie poświęcą swój czas i mi pomogą. Ty na razie zamiast pomóc albo chociaż nakierować gdzie szukać informacji to tylko piszesz, że nic nie umiem i wszystko co robię jest do d**y. Możliwe, że masz rację ale po to się uczę żeby coś umieć i nie robić rzeczy do d**y.

0
-123oho napisał(a):

Zresztą, od czasów systemów Dosopodobnych trochę minęło i nie można już odwoływać się bezpośrednio do hardware.

Nie pisałem niczego o odwoływaniu się bezpośrednio do sprzętu, pisałem ogólnie o rendererach software'owych, większość FPSów z końca lat '90 takowe posiadała, wystarczały dla nich ówczesne procesory, często nawet da się to odpalić na Win7. Nie oczekuję profesjonalnej optymalizacji, po prostu ktoś tu coś zdrowo spierniczył, tak niskie wyniki są niemożliwe.

0

Nie pisałem niczego o odwoływaniu się bezpośrednio do sprzętu, pisałem ogólnie o rendererach software'owych, większość FPSów z końca lat '90 takowe posiadała, wystarczały dla nich ówczesne procesory, często nawet da się to odpalić na Win7. Nie oczekuję profesjonalnej optymalizacji, po prostu ktoś tu coś zdrowo spierniczył, tak niskie wyniki są niemożliwe.

Ale właśnie FPSy z lat '90 (tych wcześniejszych, potem się pojawiła akceleracja) miały dosyć niskopoziomowy dostęp do sprzętu, nie mówiąc już o trikach w stylu szybkiego potęgowania. Były to mocno zoptymalizowane silniki, oczywiście tutaj to ktoś coś kopsnął że wydajność jest tak niska.

Nie. Che najpierw zrobić coś co w ogóle działa a potem to udoskonalać. jak nie chcesz pomóc to nie pomagaj i daj się wypowiedzieć innym którzy ewentualnie poświęcą swój czas i mi pomogą. Ty na razie zamiast pomóc albo chociaż nakierować gdzie szukać informacji to tylko piszesz, że nic nie umiem i wszystko co robię jest do dy. Możliwe, że masz rację ale po to się uczę żeby coś umieć i nie robić rzeczy do dy.

Ja ci mówię jaka jest prawda. A to że ty się wielce obrażasz to inna sprawa. Już nie mówiąc o tym narzekaniu jak to nie chcę ci pomóc mimo że jestem tutaj bodaj jedyną osobą która miała styczność z OpenGLem 4 Lazarus.

No cóż bitmapę 100x100 pikseli wczytuję do tablicy a następnie rysuję to na ekranie piksel po pikselu i zamieniam bufory. Rysowanie piksel po pikselu jest strasznie wolne ale nie wpadłem na pomysł jak narysować całą tablice za jednym zamachem.

No to właśnie od tego są textury. Mądrze że na to wpadłeś, głupio że szukasz złego rozwiązania w stylu ładowania nieskompresowanych BMP. Masz podaną potężną bibliotekę do ładowania tekstów, ale ty zamiast albo zrezygnować ze sprzedaży swojego super-pr0-programu albo ominięcia tego biblioteką dynamiczną jak mówiłem szukasz problemów i ignorujesz moją pomoc. Mówiłem już że nie wiesz czego chcesz, więc albo wybierz sobie jakieś rozwiązanie jakie zaproponowałem albo kurcze przestań narzekać że nie chcę pomagać bo ja ci pokazuję gdzie jest błąd w twoim jedynym słusznym rozwiązaniu.

0

Ech. zaczynam mieć wrażenie, że jak bym to w c++ napisał to by było szybciej i wygodniej. A na razie ide się uczyć jak z unitu zrobić dllke :/ i jak zainstalować Vampyre Imaging Library do lazarusa bo też mi nie idzie :/

0

Ech. zaczynam mieć wrażenie, że jak bym to w c++ napisał to by było szybciej i wygodniej.

Powiedział newbie.

i jak zainstalować Vampyre Imaging Library do lazarusa bo też mi nie idzie

Ja zazwyczaj nie instaluje komponentów tylko je ogołacam z unitów które bezpośrednio podpinam do projektu. Naprawdę nie wiem co tak wszystkich nachodzi ułatwianie wszystkiego o tyle że obiekt samemu się stworzy i zniszczy.

A na razie ide się uczyć jak z unitu zrobić dllke

Z unitu się nie da. Najlepiej to prostu zrób jakieś proste wyeksportowane funkcje w dllce które będą ładować pliki w tym Vampyre i po prostu zwracać referencję OpenGLową.

Jeszcze znalazłem takie ładowaczki textur: http://openil.sourceforge.net/ http://freeimage.sourceforge.net/ . Jakbyś na mnie nie narzekał albo googlował to byś się prędzej dowiedział.

0

No googlowałem i wszystko co wygooglowałem to albo lgpl albo pod c++ xD

1 użytkowników online, w tym zalogowanych: 0, gości: 1