[MEGOLDVA] Grafika programozása külső függvénykönyvtár nélkül.

 ( laczfinador | 2009. december 12., szombat - 13:45 )

Üdv mindenkinek!
Azzal a kérdéssel fordulok a tisztelt olvasókhoz, hogy tudnak-e valamilyen támpontot adni, merre induljak el, ha szeretnék grafikát programozni C-ben.

Amint a téma tárgyában is látható, kifejezetten csak C-ben szeretnék grafikát programozni, tehát nem valamilyen külső függvénykönyvtár segítségével. SDL-t próbáltam már, és úgy tudom C-ben íródott - vagyis annak ellenére, hogy a nyelvben nincs grafikus függvénykönyvtár, mégis lehetséges a kivitelezés - de hogyan?

Könyvet, weboldalt, bármiféle javaslatot szívesen fogadok, mert nagyon érdekelne a téma.

A válaszokért előre is köszönet!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

"vagyis annak ellenére, hogy a nyelvben nincs grafikus függvénykönyvtár, mégis lehetséges a kivitelezés - de hogyan"
Az SDL magas szintu lib. X alatt, Windows tudsz mas libbel alacsonyszintu grafikat csinalni (Intrinsics illetve GDI/GDI+). Vagy programozhatod kozvetlenul a hardvert. Mashogy ez nem megy. Az SDL is mas libekre alapoz, o sem tud csodat muvelni.

Az SDL, amennyire tudom platformfüggetlen. Az X - amennyire tudom - nem az, vagyis, ha írok egy grafikus alkalmazást X alá, az nem fog úgy ahogy van Windows alatt futni. Arra esetleg tudsz választ adni, hogy ezt az SDL hogyan kivitelezi?

Nem tudom pontosan, de nyilvan az SDL Windows eseten GDI/DIrectX hivasokkal mukodik, X alatt meg Xlib/Xt hivasokkal. Ennyi. Az a szolgaltatas amit nyujt, megvalosul minden platformon mashogy, az API ugyanaz, a melyen levo megvalositas platformfuggo.

Szerk:
"On Microsoft Windows, SDL uses a windib backend by default. A DirectX backend is also available. Older versions of SDL used DirectX 5, but SDL 1.2 (the current stable release) requires DirectX 7 by default. Sam Lantinga has stated that he plans to use DirectX 8 in future SDL releases[2].
On X11 platforms, including Linux and OpenVMS, SDL uses Xlib to communicate with the X11 system for graphics and events.
On Mac OS X, SDL uses Quartz."

Azaz minden platformon megvna, hogy mi az alatta levo backend, ami kore epiti az API-t, tkp. az SDL egy egyszeru, egyseges wrapper a kulonfele platformok grafikai alrendszerei kore. Persze itt jon egy hatrany is: csak olyan dolog lesz resze az SDL-nek, ami minden tamogatott platformon megvan (kozos nevezo).

"szeretnék grafikát programozni C-ben"

http://en.wikipedia.org/wiki/OpenGL_Utility_Toolkit
Nekünk egyetemen ezt oktatják.
Bár ez is külső függvénykönyvtár... (de gondolom ismered) :S

Igen ismerem. Az én célom viszont jelenleg az, hogy saját kóddal valósítsak meg néhány grafikai feladatot - pl.: pixel megjelenítése, háttérszín, kép betöltése - hogy jobban megértsem a mögöttes folyamatokat. Sajnos nem találtam semmilyen segédletet, leírást, könyve, ami erről szólna.:(

ket modon jarhatsz el: hasznalod az oprendszer alacsonyszintu szolgaltatasait (GDI, Xlib, DirectX, Quartz, stb.), vagy hardvert programozol kozvetlenul. Persze modern oprendszerek alatt rajohetsz, hogy az utobbi modszer nem igazan jarhato, raadasul hardverfuggo.

Milyen OS-en?
--
http://www.naszta.hu

Lehetőleg platformfüggetlen megoldást keresek.

Még egy OS-en belül csak-csak. De így? Nem kell 200 fős programozó csoportok munkáját felvállalni! Ha "csak" azt vállalod, hogy a saját kis sz@ros progid menni fog 3-4 OS alatt (ami nem mind MS :)), akkor már az is szép teher egy egészen egyszerű programnak is néha.

Inkább tanuld meg a Qt-t vagy az OpenGL-t rendesen. Ezek sem kis feladatok, de legalább értelmük van hosszú távon.
--
http://www.naszta.hu

Ezek a lehetosegek jutnak az eszembe:
1. direktben programozod a videokartya regisztereit. ehhez minden videokartyara es minden platformra meg kell irni a szukseges kodot, amit vagy rendszergazdakent kell futtatni, vagy lehet, hogy kernel modban (kernel driver). Ez kb. lehetetlenul nagy munka. Probalkozasok erre pl: svgalib, vidix, directfb (google-ben/wikipedian megtalalod ezeket). Itt a 2D grafika is irgalmatlan nagy kihivas, sok esetben dokumentacio sincs sok kartyahoz, magyarul sehogy nem tudod kitalalni melyik regiszterbe mit kene irni, kiveve ha visszafejted a windows-os (vagy akarmilyen OS-re irodott) drivert
2. hasznalod a sok videokartyaba epitett szabvanyos API-val rendelkezo rutinokat, amit ugy hivnak VESA BIOS EXTENSION. Az x.org vesa drivere is ezt hasznalja es meg sok mas. Ezt se olyan konnyu hivogatni, ez is igen alacsony szintu dolog, de meg mindig konnyebb mint az elso opcio. Ez csak 2D grafikara jo.

Ennel a kettonel sokkal jobb azonban szerintem hasznalni az X megfelelo library hivasait (OpenGL, DGA, XVideo), illetve windows megfelelo library hivasait (DirectX), mert nem lassabb es sokkal kevesebb munka, sot ezek tudnak 3D-t is.

Szinten nem a satantol valo gondolat szerintem kezdetben ennel magasabb szintu librarykat hasznalni, mint az SDL (szerk: illetve bizonyos szempontbol meg magasabb szintu a Qt, Gtk, WxWidget) igy nem kell megirni az oprendszer library hivasokkal minden OS-re kulon a kodot, mert mar megtettek neked. Az emlitett SDL csak 2D grafikara jo (azt hiszem).

szerk: ahol azt irom csak 2D grafikara jo, az persze jo 3D grafikara is, de csak szoftverbol, hardveres gyorsitas nelkul

- Use the Source Luke ! -

Az hiszem ilyesmire gondoltál:

elmélet:
http://www.inf.u-szeged.hu/oktatas/jegyzetek/KubaAttila/grafika_html/szgrafika/Grafika.html

segédanyag (szam_graf_2006_c.pdf) és gyakorlat:
http://www.inf.u-szeged.hu/~tanacs/oktatas/szggraf09/szggraf09.html

másik, korábbi félévről gyakorlat (legjobban sikerült progik letölthetőek):
http://www.inf.u-szeged.hu/~cslaszlo/CG_0607fall.html#HalFam

Devcpp/gcc segítségével win és linux alatt (akár más alatt is) forduló és futó progikat lehet csinálni.
Saját progik példának: link

A megvalósítás itt is a fentebb említett glut-tal történik, bár az elméleti anyag nagyon jó.

http://www.opengl.org/resources/libraries/glut/
"GLUT is the OpenGL Utility Toolkit, a window system independent toolkit for writing OpenGL programs. It implements a simple windowing application programming interface (API) for OpenGL."

De nem muszáj glu-ot használni... OpenGL glut nélkül is kezelhető.
http://www.opengl.org/wiki/Getting_started
http://www.khronos.org/files/opengl-quick-reference-card.pdf

Mondjuk lehet kicsit félreértettem a topic nyitót, hogy ő nem 3D-t akar hanem szimplán valamilyen 2D grafikát csinálni tetszőleges oprendszer alatt. Ez utóbbival az a baj, hogy az adott oprendszer grafikus alrendszere és api-jai nem megkerülhetőek. A hardverhez való direkt hozzáférést nem engedik minden oprendszer alatt. Ha a grafikus kártya működésére kíváncsi, akkor a VESA szabvány doksijának tanulmányozását javaslom, kb az volt a legutolsó szabványos api, amin keresztül mindenféle vga programozható oprendszertől függetlenül (a videobios tartalmazza az api-t).
http://en.wikipedia.org/wiki/VESA_BIOS_Extensions
http://www.monstersoft.com/tutorial1/VESA_intro.html
http://web.archive.org/web/20070928061020/http://www.vesa.org/public/VBE/vbe3.pdf

Kb dos alatt volt még értelme ilyet használni, azóta az oprendszerek által kínált api-n át lehet grafikázni.

Esetleg, ha platformfüggetlenséget akar próbálkozhat a java 3d-vel is.

subscribe

hat figyelj, csinalhatod az egeszet egy nagy pointerben teljesen kezzel [fb = malloc(640*480*32)], de az platformfuggetlenul nem fog neked sehol megjelenni, max ha kiexportalod bmp-be :p

roviden osszefoglalva lehetetlen kersz

--
NetBSD - Simplicity is prerequisite for reliability

Nem kell exportalni, eleve dib formatumban kell a lefoglalt memoriat hasznalni.. :)

Szerintem a low-level és a platform-független ellenkező irányba mutató igény - legalábbis hobbi szinten biztosan.
Ha egy image-et szeretnél megjeleníteni multiplatform, akkor talán vess egy pillantást a wxwidgets-re.

Üdv,
Dw.

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Inkább Qt.
--
http://www.naszta.hu

No, hát köszönöm mindenkinek a válaszát. Sok helyről azt hallottam, hogy ide csak azért járnak az emberek, hogy oltogassák a másikat, ezért aggályaim voltak e fórummal kapcsolatban, de most már megnyugodtam.:)

Azt hiszem megkaptam azokat a válaszokat, amiket kerestem, most megpróbálom megemészteni az olvasottakat.

Utolsó kérdés: hogyan tudom beállítani, hogy a téma előtt ott legyen a [MEGOLDVA] felirat?

Az eredeti, topikindító szerkesztésénél be tudod állítani a címet, és eléírod, hogy [MEGOLDVA]. Ennyi.

Köszi!:)

Ez nem nagyon fog menni. Az X programozásának
legalacsonyabb, de még értelmes szintjéhez minimum az Xlib
kell. Nagyon sokat dob a komfortérzeten az Xt könyvtár.
Ezekkel az eszközökkel mindent meg tudsz csinálni, sok-sok
munkával. Az eredmény meglehetősen hordozható lesz, ha
a C nyelvű részben ügyelsz a kompatibilitásra.

Hozzáteszem: néha szükség van egyéb könyvtárakra is, pl
nagyon jó szálgálatot szokott tenni a libjpeg, de sokszor
nem árt egy olyan rendszer sem mint a Qt (bár ez erősen
C++ aspektusú, ahogy itt kivettem a hozzászólásokból). Ha
szeretsz a dolgok mélyére ásni és egy gyors, kőstabil,
kiforrott rendszer kell, használj (open)motifot. Ez
utóbbihoz tudok kód példákat adni, illetve van egy
minimális mintaprogramom az ftp szerveremen, azt is
letöltheted, abban van pixelkezelés.

protokol: ftp
domain: meditor.hu
user: public
passwd: nyomj egy üres entert

cd ./xwin_demo
és itt van egy tar.gz

Én így csinálnám.
> Sol omnibus lucet.

"de nekem csak olyan enter-em van, amire van irva/rajzolva valami, ures nincs!" :-)
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Hát az már baj. A szerverem szűri a dizájnos billentyűzeteket.

> Sol omnibus lucet.