[C++, OpenGL] Nakładanie obrazków PNG na obiekt-teksturowani


#1

Witam,

"bawię się" teraz w tworzenie mapki do gry w OpenGL, jednak nadszedł wreszcie czas na nałożenie tekstur. Tu jest problem, gdyż chciałbym do tego celu użyć obrazków PNG, lecz nie wiem za bardzo jak. Głównie znalazłem poradniki dotyczące nakładania tekstur BMP, co nie za bardzo mi odpowiada... Więc, jak te tekstury nałożyć? Czy GLUT nie zawiera jakichś "ułatwień" czasem?

Pozdrawiam.


(Razi) #2

DevILa użyj :slight_smile: To biblioteka do wczytywania różnych formatów grafiki, m.in. TGA, BMP, PNG, JPG: http://openil.sourceforge.net/features.

Ewentualnie przenieś się na SDL i SDL-Image, też otwiera sporo formatów.

libglpng też wydaje się dobry:

http://www.fifi.org/doc/libglpng-dev/glpng.html

SOIL też jest dość popularny i łatwy w użyciu:

http://www.lonesock.net/soil.html

Szukajcie, a znajdziecie.

Możesz też oryginalnego libpng, ale wtedy masz obsługę jednego formatu


#3

Znalazlem taką stronę, skopiowałem z niej kod żeby zobaczyć jak działa, jednak nadal są błędy:


(Razi) #4

undefinied reference oznacza że znalazł deklarację, ale nie definicję, czyli nie zlinkowałeś jakiejś biblioteki.

Do linkera dodaj:

-ldevil -lilut -lilu

#5

Dzięki wielkie :slight_smile:

A nie wiesz czy wystawiona jest gdzieś lista błędów devIL?

blad07864.png

Tak to w tej chwili wygląda.


(Razi) #6

http://docs.google.com/viewer?a=v&q=cac ... pDgcqnUf2w

Google jest darmowe, wiesz?

Daj trochę kodu i upewnij się że ten plik jest we wskazanym miejscu i ma poprawne rozszerzenie.


#7
#include 

#include 


#undef _UNICODE

#include "il.h"


#pragma comment( lib, "DevIL.lib" )


// Wow. DevIL is amazing.


// From http://gpwiki.org/index.php/DevIL:Tutorials:Basics


// The library consists of three sub-libraries:

// * IL - main DevIL library. It allows you to load and save images to files. Every function in this library have 'il' prefixed to their name.

// * ILU - this library contains functions for altering images. Every function in this library have 'ilu' prefixed to their name.

// * ILUT - this library connects DevIL with OpenGL. Every function in this library have 'ilut' prefixed to their name.


int main()

{

  ilInit();

  printf("DevIL has been initialized\n");


  // Loading an image

  ILboolean result = ilLoadImage( "tex1.png" ) ;


  if( result == true )

  {

    printf("the image loaded successfully\n");

  }

  else

  {

    printf("The image failed to load\n" ) ;


    ILenum err = ilGetError() ;

    printf( "the error %d\n", err );

    printf( "string is %s\n", ilGetString( err ) );

  }


  int size = ilGetInteger( IL_IMAGE_SIZE_OF_DATA ) ;

  printf("Data size: %d\n", size );

  ILubyte * bytes = ilGetData() ;


  for( int i = 0 ; i < size; i++ )

  {

    // see we should see the byte data of the image now.

    printf( "%d\n", bytes[i] );

  }

}

Proszę bardzo. Plik jest raczej w poprawnym miejscu.


(Razi) #8

U mnie działa dobrze, tzn. jeśli jest plik, to go wczytuje i działa poprawnie, jeśli pliku nie ma, to wyskakuje ten sam problem co u ciebie. Upewnij się jeszcze raz czy ten plik jest w tym samym miejscu co exe i w "aktywnym folderze" aplikacji gdy uruchamiasz przez IDE. Spróbuj bez IDE odpalić (skopiuj brakujące DLLki, napisze ci których, szukaj ich w folderze z biblioteką)


#9

więc tak: zmieniłem obrazek na inny: także nic. Spróbowałem to zrobić poza IDE, podałem mu DLL'ki i chyba też jest źle (nie wiem czy tak bo po włączeniu od razu się zamyka :/).

To może podeślij mi ten twój projekt i zobaczymy czy działa u mnie, może coś źle skonfigurowałem...

obrazek wsadziłem tam gdzie mam pliki *.cpp czyli w folderze glównym


(Razi) #10

Ja zmieniałem tylko na tyle żeby to u mnie skompilować, bo uzywam Linuka i instaluje tylko devki, jedyna różnica to to że plik .h znajdował się w i nie miałem biblioteki libdevil.a, tylko sam IL i ILUT (z dużych). Poza tym do takich testów nie tworzę projektów, tylko ręcznie kompiluję przez G++.

Plik wykonywalny i "aktywny" przy projektach zawsze znajduje się w innym folderze niż źródła, więc tam tego obrazka nawet nie wsadzaj.

Uruchom w konsoli ten program, albo dodaj jakiegoś zatrzymywacza na końcu i zobacz czy jak normalnie odpalasz to czy ładuje, czy nie, co ty nigdy konsolówek nie pisałeś i nie wiesz jak się takie problemy rozwiązuje?


#11

hmmm. Podobno są jakieś problemy z DevIL'em na Code::Blocks. http://compsci.ca/v3/viewtopic.php?t=20166

Pisali też, żeby podać ścieżkę bezwzględną. Zrobiłem i nadal nic :confused: Próbowałem uruchomić plik poza IDE i nadal to samo... Chyba będę musiał się na razie zadowolić obrazkami BMP.

A tak na marginesie, to gdzie Code::Blocks szuka właściwie tych obrazków?


(Razi) #12

Wypisz do konsoli "aktualny folder", np. wywołaj polecenie dir. Nie wiem czy na windowsach nowych to działa tak samo jak na dir z wine na linuksie, ale wypluwa coś takiego:

Te pogrubione to aktualny folder, którym jest "./".

W tym wątku mowa jest właśnie o tej ścieżce i to nie jest problem Code::Blocksa, tylko ścieżki wykonywania.

Standardowo "aktualnym folderem" wykonywania projektu w C::B jest folder samego projektu (tam gdzie foldery src, obj itd).

W ustawieniach projektu w zakładce Build targets zmień dla Debug i Release "Execution working dir" z "." na np. "./test" i w folderze "./test" trzymaj ten obrazek.


#13

Teraz to kompletnie jestem z zbity z tropu:

taką miałem ścieżkę w Execution Working Dir:

No dobra. Wstawiłem do tego folderu co był w ścieżce ten obrazek i o dziwo...

nie działa. error1285.png

Tym razem wyświetlił się jeszcze inny błąd. Co gorsza nie mogę znaleźć pełnej listy błędów i nie wiem o co chodzi :confused:

BTW: Czy to execution working dir też jest w Visualu? Gdzie?

-- Dodane 01.11.2011 (Wt) 10:54 --

znalazłem.

Strona 28 http://www-f9.ijs.si/~matevz/docs/DevIL ... Manual.pdf

co oznacza że jest nieprawidłowa wartość (WTF?!).

Dobra spróbuję inny obrazek

-- Dodane 01.11.2011 (Wt) 10:57 --

Działa :smiley: Dzięki wielkie!