Skocz do zawartości

[c++]Fonty w OpenGL


Qbe

Polecane posty

Proszę mi pomóc dobrać odpowiednią bibliotekę do tworzenia napisów w OpenGL.

Tworzę grę, chciałbym dużymi kolorowymi literkami napisać w kolejnych jego odsłonach napisy w stylu "Player"/"Computer"...

 

Z tego co wyczytałem: "There is no native font support in OpenGL".

Robię grę z użyciem GLUTa, ale tam jest marna obsługa. Myślałem o czym efektywniejszym.

 

Co polecicie?

Link do komentarza
Udostępnij na innych stronach

Polecam pisanie własnej klasy do czcionek. To najbezpieczniejszy sposób, żeby to było przenośne. Masz jakąś bitmapę ze wszystkimi literkami w równych odstępach, najłatwiej jeszcze jak czcionka którą używasz ma stałą szerokość znaków (Monospace itp.) i po prostu w funkcji rysującej napisy używasz tej tekstury rysując prostokąty z odpowiednimi parametrami texCoord. Czcionkę bitmapową możesz sobie wygenerować programem http://www.codehead.co.uk/cbfg/. Program działa nawet pod wine w systemie Linux.

Link do komentarza
Udostępnij na innych stronach

Ten program jest na windowsa. A co z przenośnością na linuksa pliku z wygenerowanymi czcionkami? Nie znam się na tym jak to wygląda...

 

A istnieje jakiś łatwiejszy sposób na zrobienie dużego napisu w stylu "Battleship" który będzie miał tak ze 50pikseli?

Link do komentarza
Udostępnij na innych stronach

Ten program jest na windowsa. A co z przenośnością na linuksa pliku z wygenerowanymi czcionkami? Nie znam się na tym jak to wygląda...

 

A istnieje jakiś łatwiejszy sposób na zrobienie dużego napisu w stylu "Battleship" który będzie miał tak ze 50pikseli?

Ten program generuje jakiegoś png, czy tga, albo nawet bmp z literkami, również z przezroczystością.

 

Chodzi o to, że używając pygame i jego modułu do obsługi fontów (ttf itp.), trochę się zawiodłem. Na Linuksie i WinXP to zawsze działało. Na Win7 niektórym ludziom szło, niektórym nie wyświetlały się czcionki. Dlatego zamiast generować czcionki z ttf'ów w kodzie programu, wziąłem się za prostą klasę renderującą czcionki za pomocą tekstury i to już na wszystkich wymienionych systemach śmiga. Jak chcesz zrobić napis na logo to możesz pojedynczą teksturę wrzucić z całym napisem, zamiast się rozdrabniać na system wyświetlający literki ;)

 

Tak wygląda moja klasa do fontów w Python'ie z biblioteką pyopengl:

KODfrom OpenGL.GL import *

from OpenGL.GLU import *

import pygame, pygame.image

from pygame.locals import *

from Texture import Texture

 

TEXDIR="data/textures/"

 

class Font():

def __init__(self):

self.font_t = Texture(TEXDIR+"Font.png")

self.char=[]

max_x=21

cur_x=0

cur_y=0

for i in range(ord(' '),ord('~')):

self.char.append([float(cur_x)*12.0/256.0,-float(cur_y)*23.0/256.0,float(cur_x+1)*12.0/256.0,-float(cur_y+1)*23.0/256.0])

cur_x+=1

if cur_x>=max_x:

cur_x=0

cur_y+=1

def draw(self,s,x=0.0,y=0.0,scale=1.0):

s = str(s)

i = 0

lx = 0.18 #szerokosc znaku

ly = 0.345 #wysokosc znaku

glPushMatrix()

glBindTexture(GL_TEXTURE_2D,self.font_t.texID)

glTranslatef(x,y,0)

glScalef(scale,scale,1.0)

while i < len(s):

glTranslatef(lx,0,0)

ch = self.char[ ord( s )-ord(' ') ]

glBegin(GL_QUADS)

glTexCoord2f(ch[0],ch[1])

glVertex2d(-lx,ly)

glTexCoord2f(ch[2],ch[1])

glVertex2d(0,ly)

glTexCoord2f(ch[2],ch[3])

glVertex2d(0,0)

glTexCoord2f(ch[0],ch[3])

glVertex2d(-lx,0)

glEnd()

i += 1

glPopMatrix()

Po osi Y generacja tex coord'ów idzie ujemnie, ponieważ klasa, którą ładuję tekstury, ładuje je do góry nogami ;) Takie skomplikowane rozwiązanie to to nie jest ;)

 

Ja tą klasę pisałem do aplikacji na gluOrtho2D bez przesuwania planszy, więc nie dodawałem żadnych udogodnień uniezależniających wyświetlanie napisów od położenia kamery, ale to też da się zrobić :)

Link do komentarza
Udostępnij na innych stronach

Ukłon w twoją stronę kolego:)

 

Szlag mnie trafia, bo nie idzie na ten temat znaleźć informacji w necie... Nie wiem czy nie umiem szukać, ale coraz bardziej mnie irytuje to, że całe popołudnie straciłem i nie umiem nawet napisać na ekranie wielkimi literami BATTLESHIP...

Nie wiem co ta klasa ma zawierać, jakimi metodami wczytywać te czcionki w C++ i nie mam pojęcia jak ją zbudować... POMOCY

Link do komentarza
Udostępnij na innych stronach

Wystarczyła by mi najprostsza czcionka tylko pod warunkiem, że byłaby większa niż 24piksele... a tego niestety ani Glut, ani OpenGL nie zapewnia...

 

A czy mógłby mi ktoś podać jakiś manual do utworzenia tej klasy. Nie mam pojęcia jak ona powinna być zaimplementowana. Albo wysłać taką klasę już gotową (najprostszą), a ja bym ją delikatnie przerobił na swój projekt (Wystarczy mi taka co po prostu wyświetli duży napis z pliku *.tga).

Link do komentarza
Udostępnij na innych stronach

Moim zdaniem zabierasz się od złej strony do tego wszystkiego... Chcesz napisać grę, zaczynasz od logo. Chcesz wczytać teksturę, nie wiesz jak.

 

http://www.dimmension3.spine.pl/modules.ph..._tutorial&nr=29 - tutorial stary, ale sam od niego zaczynałem pisanie gier 2D z użyciem OpenGL, dawno temu :D

 

Skoro nawet nie potrafisz wczytać i wyświetlić pojedynczej bitmapy, to się nie łam i od tego zacznij. Jeśli umiesz korzystać z bibliotek innych niż OpenGL, to polecam użycie SDL'a do ładowania tekstur z plików *.bmp.

 

texture.h

#ifndef __TEXTURE_H
#define __TEXTURE_H
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glext.h>
#include <SDL/SDL.h>

using namespace std;

class CTexture
{
   public:
       void LoadBMP(string filename,bool alpha=false);
       GLuint texID;
   private:
};
#endif&ąśęrŚ  #include "texture.h"

void CTexture::LoadBMP(string filename,bool alpha)
{
   int JGL_BGR=32992,JGL_BGRA=32993;
   SDL_Surface* bmpFile;
   if ((bmpFile = SDL_LoadBMP(filename.c_str())))
   {
       glPixelStorei(GL_UNPACK_ALIGNMENT,4);
       glGenTextures(1,&texID);
       glBindTexture(GL_TEXTURE_2D,texID);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexImage2D( GL_TEXTURE_2D, 0, bmpFile->format->BytesPerPixel, bmpFile->w, bmpFile->h, 0,
                         alpha?JGL_BGRA:JGL_BGR, GL_UNSIGNED_BYTE, bmpFile->pixels );
       SDL_FreeSurface(bmpFile);
   }
   else cout << "Plik " << filename << " nie istnieje" << endl;
}

 

Masz kod klasy do ładowania tekstur za pomocą funkcji z biblioteki SDL. To z mojego starego projektu. Po załadowaniu tekstury bindujesz funkcją glBindTexture() człon texID jako GL_TEXTURE_2D.

 

Skoro używasz glut'a, możesz korzystając z jego funkcji również napisać ładowanie bitmap.

Link do komentarza
Udostępnij na innych stronach

Dziękuje bardzo kolego:)

 

Zainstalowałem SDL i chyba zrobie wszystkie napisy za zasadzie gotowych obrazków (stworzę je w Photoshopie i zapisze z rozszerzeniem *.bmp).

Nie potrzebuje ich zbyt wiele, projekt nie jest rozbudowany, więc mam nadzieję, że nie będzie to syzyfowa praca.

 

Zacząć zabawę z bibliotekami graficznymi szukając informacji w internecie to nieciekawy start... Może powinienem kupić jakąś fachową literaturę, ale sam nie wiem czy do czegokolwiek mi się to przyda poza tym projektem na zaliczenie. Wielu znajomych robiąc różne zlecenia posługuje się albo MFC, albo WxWidget, albo WinAPI. Jeszcze nie spotkałem się z tym by któryś robił coś w OpenGL... Sam używam jej, bo ktoś na forum mi ją polecił. Napisałem co potrzebuje osiągnąć, a forumowicze doradzili mi właśnie OpenGL. Teraz już jestem mądrzejszy o to, że moje prymitywne funkcjonalności zapewnia każda biblioteka graficzna, ale mam nadzieję, że nie będę żałował wyboru...

 

Mam pytanie odnośnie tej klasy. Wrzuciłem w katalog z tymi plikami (texture.h, texture.cpp) plik "logo.bmp" i go funkcja SDL_LoadBMP nie znajduje...

Jak należy tego używać. Utworzyłem egzemplarz klasy:

CTexture logo;

i wywołałem na jego rzecz:

logo.LoadBMP("logo.bmp",1);

i wypisuje w konsoli, że pliku nie ma...

Link do komentarza
Udostępnij na innych stronach

Problem może być z tym, że tworzysz klasę CTexture i ładujesz teksturę przed inicjacją OpenGL. Aby załadować teksturę dla OpenGL, OpenGL musi być wcześniej zainicjowany.

Jeśli wypisuje Ci tekst z "else", to może np. wielkość znaków się nie zgadza, bo mogłeś napisać "Logo.bmp", zamiast "logo.bmp", albo program exe uruchamiasz w innym katalogu, niż katalog z obrazkiem i nie chodzi mi o to, że pliki źródłowe są w innym katalogu niż obrazek, tylko sam plik wykonywalny.

 

A co do wyboru OpenGL, to ja bym OGL do gier 2D na nic innego nie wymieniał. OpenGL daje dużą swobodę, bez zbędnych kombinacji, jakie trzeba stosować w silnikach 2D (które bądź, co bądź też mogą używać OpenGL ;) ). W silnikach jest o tyle dobrze, że wszystkie funkcje masz zazwyczaj bardziej dopracowane, niż jakbyś sam pisał. Ja na razie na poważnie to tylko silnika 3D używałem (Panda 3D z poziomu języka Python).

Link do komentarza
Udostępnij na innych stronach

Ja to w ogóle piszę na Linuksie (Ubuntu 10.10), więc pliku EXE nie mam. Raczej nie ma problemu z błędną nazwą bądź tym, że plik wykonywalny jest w innym katalogu. Wszystko jest w jednym folderze, a nazwę wymyśliłem sam.

Znów szlag mnie trafia. Nie działa mi to dalej... Trzeci dzień stracony i mam dość OpenGL...

Czy twórcy to byli takie lenie, że nie chciało się im napisać jakieś uniwersalnej funkcji do wczytywania bitmap?

 

Nie wiem już gdzie mam szukać i jak szukać. Wszystko w necie ma nagłówki <windows.h>, albo się nie kompiluje, albo wywala "Segmentation Fault"...

Link do komentarza
Udostępnij na innych stronach

To nawet dobra sprawa, że to robisz pod Ubuntu, zainstaluj Code::Blocks (jeśli nie używasz) i weź ten projekt http://download.jason.o12.pl/SDLszescian.zip...

Specjalnie na potrzeby tego tematu to zrobiłem, więc doceń to i napisz w końcu jakąś grę :D

 

Jak będziesz chciał rozbudować framework o inne klasy to jeśli w ich konstruktorach będziesz tworzył instancję klasy CTexture to pamiętaj by instancje tych nowych klas były dynamicznie tworzone po inicjacji OpenGL!

Link do komentarza
Udostępnij na innych stronach

Niestety GIMP nie ma takich efektów.... Chciałem zrobić płonący napis BATTLESHIP.

 

To CODE BLOCKS to jest program...?! Myślałem, że jakaś kolejna biblioteka/nakładka:P

 

Myśląc o przyszłości (czyli czasie PO studiach) chciałem zostać programistą C++, ale ten zaliczeniowy projekt dał mi tak popalić, że już sam nie wiem...

Link do komentarza
Udostępnij na innych stronach

Niestety GIMP nie ma takich efektów.... Chciałem zrobić płonący napis BATTLESHIP.

 

To CODE BLOCKS to jest program...?! Myślałem, że jakaś kolejna biblioteka/nakładka:P

 

Myśląc o przyszłości (czyli czasie PO studiach) chciałem zostać programistą C++, ale ten zaliczeniowy projekt dał mi tak popalić, że już sam nie wiem...

Code::Blocks to środowisko programistyczne. Masz to w repozytorium Ubuntu. Więcej bibliotek/nakładek raczej Ci nie potrzeba bo SDL'a ten program używa do wywołania okna OpenGL i do ładowania plików BMP, no i OpenGL'a do reszty czynności.

 

Ambitne, że chcesz zostać programistą C++ w czasach, w których większość ludzi woli języki wyższego poziomu (np. Python), ale Twój pogląd na te sprawy pewnie się ukształtuje w trakcie studiów ;). Przynajmniej ja tak miałem, wcześniej C++, teraz bym raczej wolał pracować w Python'ie.

 

Nie napisałeś, czy odpaliłeś przykład ode mnie ;)

Link do komentarza
Udostępnij na innych stronach

O Pythonie jeszcze nie mam pojęcia. Nawet nie wiem do czego on służy.

Wszystko się podczas studiów okaże. Jestem dopiero na drugim roku. Na pewno nie chce być hardware'owcem - i nie chce tworzyć żadnych sieci, układów itp.

Interesuje mnie jak na razie tylko "kodowanie". A który język wybiorę to już kwestia wyboru upodobania, gdy poznam ich kilka:)

 

Zainstalowałem ten program i szczerze jestem miło zaskoczony nim:) Odpaliłem twój przykład i po jego uruchomieniu bitmapa została wczytana. Dałeś mi "światełko w tunelu", bo już miałem się poddać i uciekać na windowsa... Mam nadzieję, że na podstawie twojego przykładu uda mi się wreszcie pokonać ten problem napisów/bitmap:)

 

Dziękuje za pomoc:)

Link do komentarza
Udostępnij na innych stronach

Jeśli chodzi o pisanie aplikacji z użyciem OpenGL, to pod Windowsem tak samo się pisze (jak używa się SDL'a i innych wieloplatformowych bibliotek). Ten projekt co Ci dałem, możesz spokojnie pod Windowsem w Code::Blocks odpalić, tylko musisz sobie dograć do include i lib bibliotekę SDL, no i w katalogu z programem musisz umieścić SDL.dll, no i jeszcze musisz w opcjach linkera zmienić nazwy bibliotek, pod Win to nie jest GL, czy GLU, tylko opengl32 i glu32, o ile dobrze pamiętam. Reszta jest raczej tak samo ;) Dla porównania Python'a z C++ dodam, że w Python'ie nie trzeba się martwić o ustawienia linkera, wystarczą python'owe nagłówki dla bibliotek i wszystko śmiga ;) Czyli programy są bardziej przenośne i bardziej opensource - bo można je odpalać prosto ze źródła (a także ze skompilowanych plików *.pyc).

Link do komentarza
Udostępnij na innych stronach

Tak, można w nim używać bibliotek nawet własnoręcznie napisanych w C, tylko trzeba nagłówki (bindy) napisać do funkcji. W tym języku można też napisać mechanizmy serwisu internetowego (coś jak PHP, albo bardziej servlety Javy). Dla przykładu zobacz moją grę :)http://jasonuniverse.appspot.com/str/pokaz...3N0cm9uYRihlgMM - Python+OpenGL itd.

Link do komentarza
Udostępnij na innych stronach

Użyłem twojego programu z tym sześcianem i staram się go przerobić i udoskonalić tak, by nadawał się do mojego projektu.

Tylko już sam nie wiem co w czym robić :lol: Czy w SDLu czy czystym OGLu, czy może powołać się na Glut'a :lol:

 

Gra ciekawa tylko nie za bardzo wiem co się w niej dzieje:P

 

Względnie przez godzinę zrobiłem więcej niż ostatnio przez tyle dni...:D

Link do komentarza
Udostępnij na innych stronach

Zdaje się, że trochę nie odróżniasz przeznaczenia bibliotek ;)

 

OpenGL zawsze używa się w połączeniu z jakąś inną biblioteką, która obsługuje okno programu, klawiaturę, mysz itp., czyli ogólnie komunikaty dla tego okna. W Twoich wcześniejszych projektach GLUT pełnił taką rolę, jak SDL w tym, co Ci dałem. W SDL bez OpenGL można pisać programy 2D, ale SDL pozwala na połączenie z OpenGL'em, czyli cale rysowanie w grze piszesz w OpenGL, a sterowanie (mysz, klawiaturę) obsługuje SDL.

Link do komentarza
Udostępnij na innych stronach

Wiem, że dość ciężko się ze mną rozmawia na te tematy, bo jestem zielony w bibliotekach graficznych... Pasowałoby nad tym przysiąść najpierw i zaznajomić się z podstawową terminologią, ale tak to niestety na studiach w naszym kraju nie działa... Student ma coś zrobić, ale nikt nie wyjaśni nic, nie pomoże, nie doradzi, ani nawet nie da zbyt wiele czasu na wykonanie, by się do tego porządnie zabrać. To sprawia, że student działa na zasadzie kombinowania: coś poczyta, coś popyta, coś pościemnia i kończy się to na tym, że zwykle nie ma się pojęcia o tym co się zrobiło, bądź ma ale bardzo ograniczone, bo dążyło się jedynie do uzyskania zaliczenia, a nie nauczenia się czegoś.

 

Miałem wykłady z C++ jedynie z użyciem konsoli, a jako projekt zaliczeniowy z labolatoriów mam wykonać grę z użyciem biblioteki graficznej. Więc od czego zacząłem? Od głupich pytań na forach na zasadzie "Którą bibliotekę użyć?"

 

Trochę inny start z bibliotekami graficznymi mi się marzył, ale nie ma co narzekać, tylko zrobić ten projekt, po czym (mając więcej czasu) przysiąść porządnie do obycia się z Graphics Library... Teraz mając 1,5tygodnia na wykonanie projektu + święta raczej nie mam czasu na czytanie...

 

Już załapałem mniej/więcej jak to działa. Dodałem do SDLa obsługę myszki (z kursów DDT) i na razie udało się zrobić proste menu i jego poszczególne "ekrany":)

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...