Yksinkertaisesti: Kääntyykö DirectX Borlandilla? Olen ymmärtänyt, että DirectX ei käänny muualla kuin Microsoft Visual C++ :lla.
Borland C++ Builderilla? Apua saattaa löytyä tuolta:
Kyllähän se kääntyy ainakin Dev-C++:lla. Pitää vain olla omalle käääntäjälle sopivat linkitettävät kirjastot.
(Mikäs vika OpenGL:ssä oli ;)
OpenGL :ssä ei varmasti vikaa, mutta Suomenkielistä opasta on turha hakea.
Näin vähän offtopikkina... Suomeksi löytyy ainakin http://www.suomipelit.com/nayta_artikkeli.php?id=57&tyyppi=1&osasto=0
Ja kyllä ne NeHen tutot ihan selkeitä on.
http://www.suomipelit.com/nayta_artikkeli.php?id=57&tyyppi=1&osasto=0
http://www.suomipelit.com/nayta_artikkeli.php?id=58&tyyppi=1&osasto=0
http://www.suomipelit.com/nayta_artikkeli.php?id=59&tyyppi=1&osasto=0
http://www.suomipelit.com/nayta_artikkeli.php?id=60&tyyppi=1&osasto=0
edit. noh, menipäs samaan aikaan :o
Joo tiedän nuo, ja olenkin jo lukenut läpi, kuitenkin tarvitsisin vielä lisätietoa. Nuo on pelkkiä perusteita. Suomenkielisiä kirjoja ei löydy. NeHeistä sen verran, kun yritän kääntää sen oppitunnin 6, tulee virheilmoitus:
[Linker Error] Unresolved external '_main' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0X32.OBJ
Löysin tähän ongelmaan netistä neuvon:
http://bdn.borland.com/article/0,1410,27343,00.
Ongelman pahemmaksi tekee se, että en tee Console Application, vaan ihan perus cpp fileellä ja teen siitä projektin. Joo yritin siirtää koodin myös console application, ja sehän tuotti lisää virheilmoituksia. Kaikki Borlandin käyttäjät nyt olisi apu kohdallaan.
Miten yrität sen kääntää?
Joskus tein DirectX juttuja Borlandin Builderilla ja siinä piti niitä .libbejä hiukan rukata. DirectX:n tai Builderin mukana tuli komentorivi-ohjelma jolle piti syöttää DirectX:n .libit joka muokkasi niistä builderin ymmärtämät versiot. LibToCoff tai joku sellainen.
Näin siis joskus pari vuotta sitten.
Tallennan ohjelman ja käännän ihan vain klikkaamalla RUN.
Ja miten olet tehnyt sen ohjelman?
Jos haluat tehdä aivan oikein, teet Console Wizardilla uuden projektin ja rastit pois kaikki (ainakin VCL, CLX ja Console Application.) Silloin voit ohjelmoida suhteellisen standardilla tavalla.
Toinen vaihtoehto on ladata suoraan se C++ Builder Project -paketti, mutta tätä vaihtoehtoa en suosittele, koska siinä oppii paljon huonoja tapoja. Mutta jos aiot orjallisesti lukea NeHen opassarjaa, tästä paketista tarvitset joka tapauksessa GLAux-kirjaston, siis sen .lib-tiedoston. Se pitää liittää NeHen esimerkkeihin, Project -> Add to Project.
Ok, se error lähti pois, tilalle tuli siis:
[Linker Error] Unresolved external 'WinMain' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0W32.OBJ
Tähänkin löysin apua netistä: http://www.codepedia.com/wiki/printer.aspx?
Tästäkään ei ole yhtään apua. En ole tallentanut ohjelmaa tai projektia minkään muun päälle.
Myöhemmin avaan projektin uudestaan:
The project's target could not be found in file teksture.cpp. The project's target is commonly WinMain or DllEntryPoint.
Eli projekti ei aukea, teksture.cpp aukeaa, mutta sitä ei voi kääntää enään. Että tälläistä.
EDIT:
Latasin sen paketin sittenkin, mutta virheet eivät hellitä:
[Linker Error] Unresolved external 'auxDIBImageLoadA' referenced from [...]\LESSON06.OBJ
Ja kerropa taas, mitä siis teit. Ja mikä Builderin versio on kyseessä?
Suosittelen vakavasti sellaista vaihtoehtoa, että et kopioi koodia suoraan vaan aloitat aivan itse alusta asti tuon tekemisen.
Eli siis tein niinkuin sanoit, raksin pois kaikki (VCL, CLX ja Console Application) ja ajoin ohjelman. Tuli WinMain error.
Latasin sen borland-paketin oppitunnista 6, tuli error auxDIBImageLoadA. Huomasin, että ohjelmassa ylimääräistä koodia (ikkunan tekemistä yms.), poistin ne, ja erroriksi tuli WinMain jälleen. Enpä taida jaksaa enään NeHeä, Suomipelit.comin oppaat saa riittää.
Borland 6.0 Enterprise Suite vuosimallia 2002
Kuulostaa kyllä siltä, että kääntäjässä on jotakin vikaa. Minulla nuo toimivat Borlandin vastaavalla kokeiluversiolla aivan hyvin.
Ei siinä pitäisi mitään vikaa olla. Perusohjelmat toimivat ihan hyvin. Suomipelit.comin vastaavat esimerkit toimii...
Mitens pystyy tallentamaan kuvan raakadatana? Käytän Painttia Abode PhotoShop 7.0, Abode ImageReady 7.0, ehkä Abode Illustrador. Ohjelmani sisältää kuvia, joita ei tulisi nähdä.
Miten raakadatana? Ja miten ajattelit sen ladata? Sitä paitsi monet katseluohjelmat tunnistavat raakadatakuvan, eli niin kauan kuin et kehitä omaa salaus- tai pakkausmenetelmää kuvallesi, se on kyllä helposti saatavilla tavalla tai toisella.
Raw-formaatissa tallentaminen onnistuu muistaakseni ainakin IrfanViewillä, ja luulisi kyllä noidenkin ohjelmien osaavan.
OpenGL lataa raakadataa suoraan, samalla se siis helpottaa teksturointia. Raakadatakuvilla ei ole päätettä, ellei itse halua. Mutta kokeilenpas nyt .RAWia
TULOS:
Eipä tuottanut vieläkään toivottua tulosta, mutta paras tähän mennessä.
Niin, mutta OpenGL ei muistaakseni osaa lukea tiedostoja, eli joudut itse lataamaan kuitenkin.
Suosittelen vahvasti glpng-kirjastoa. PNG-tiedostot ovat aika käteviä muutenkin. Jos kiinnostaa, voin laittaa valmiiksi käännetyn kirjastopaketin jonnekin...
Miten glpng-kirjastoa käytetään? Ja laita se paketti myös.
EDIT: Kokeilin kirjastoa laittamalla #include <GL\glpng.h> ja lataamalla kuvat suoraan tyyliin testikuva.png, tuloksena oli vaikka mitä värejä ympäri ikkunaa.
Toistaiseksi laitoin saataville tänne: linkki. Sieltä löytyy myös Googlella löytyvä dokumentaatio ja esimerkki.
Tiiviimmillään käyttö onnistuu näin:
// Ladataan tiedostosta kuva.png, // luodaan mipmapit, // käytetään aplha-kanavaa, jos sellainen on, // ei välitetä kuvan tiedoista (leveys, korkeus yms...), // jos koordinaatit menevät yli, jatketaan toisesta reunasta, // käytetään lineaarista suodatusta venyttämisessä ja kutistamisessa GLuint texture = pngBind("kuva.png", PNG_BUILDMIPMAPS, PNG_ALPHA, 0, GL_REPEAT, GL_LINEAR, GL_LINEAR); if (!texture) { // Lataaminen EI onnistunut! }
Ja tästä eteenpäin tukeudutaankin taas OpenGL-oppaisiin teksturoinnista. Eikä unohdeta lopuksi glDeleteTextures-funktiota.
Oisko vielä käytännön esimerkki?
No tuohan oli käytännön esimerkki. Tuo siis lataa tekstuurin tiedostosta ja laittaa sen tunnisteen texture-muuttujaan. Jos et osaa itse soveltaa sitä vaikapa Suomipelit.comin esimerkkeihin, olet kurkottamassa pahasti liian korkealle.
Tuo kyseinen funktio sisältää kutsut funktioille glGenTextures, glBindTexture, glTexParameteri ja glTexImage2D sekä kuvan lataamisen tiedostosta.
Kokonainen ohjelma käyttöohjeineen löytyy kyllä tuolta linkin takana olevan linkin takaa. Jos ei löydy, niin tästä on siis kyse: http://www.wyatt100.freeserve.co.uk/download.htm
Tadaa! Jotain jo söhelsin, mutta tuli [linker error]. Kokeilkaas toimiiko teidän kääntäjillä. Lineaarisista venytyksistä mistä lie ei ollut mainintaa Suomipelit.comissa.
//--------------------------------------------------------------------------- #include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- #include <GL\glpng.h> #include <iostream.h> #pragma argsused #include <windows.h> #include <stdio.h> #include <math.h> #include <gl\gl.h> #include <gl\glu.h> //#include <gl\glext> // Ei tarvita tässä ohjelmassa // Määrittele laitekonteksti globaaliksi sitä nimittäin tarvitaan myös pääfunktiossa. HDC hdc; // Viestinkäsittelijä LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // Koska piirrämme ikkunan sisällön pääsilmukassa jatkuvasti uudelleen // reakoimme WM_PAINT-viestiin vain tyhjentämällä ikkunan mustaksi. case WM_PAINT: { PAINTSTRUCT p; BeginPaint(hwnd, &p); glClear(GL_COLOR_BUFFER_BIT); SwapBuffers(hdc); EndPaint(hwnd, &p); return 0; } // Ikkuna yritetään sulkea kutsu PostQuitMessage()-funktiota. case WM_CLOSE: { PostQuitMessage(0); return 0; } // Käsittele myös WM_SIZE se lähetetään ikkunalle aina kun sen kokoa muutetaan. // Tämä on oiva tilaisuus muuttaa viewport // oikean kokoiseksi peittämään koko ikkuna. case WM_SIZE: { // Ikkunan uusi koko saadaan lParam parametrista LOWORD ja HIWORD makroilla. glViewport(0, 0, LOWORD(lParam), HIWORD(lParam)); return 0; } } // Viestiä ei käsitelty kutsu DefWindowProc()-funktiota. return DefWindowProc(hwnd, uMsg, wParam, lParam); } int luoIkkuna(unsigned int leveys, unsigned int korkeus, char *otsikko) { // Rekisteröi ikkunaluokka WNDCLASS wc; memset(&wc, 0, sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.hCursor= LoadCursor(NULL, IDC_ARROW); wc.lpfnWndProc = (WNDPROC) WindowProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = "OpenGLtutoriaali"; if (!RegisterClass(&wc)) return 0; // Luo ikkuna RECT r; r.left=GetSystemMetrics(SM_CXSCREEN)/2-leveys/2; r.top=GetSystemMetrics(SM_CYSCREEN)/2-korkeus/2; r.right=r.left+leveys; r.bottom=r.top+korkeus; AdjustWindowRectEx(&r, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW); HWND hwnd; hwnd=CreateWindowEx(WS_EX_APPWINDOW, "OpenGLtutoriaali", otsikko, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, r.left, r.top, r.right-r.left, r.bottom-r.top, NULL, NULL, GetModuleHandle(NULL), NULL); // Luo laitekonteksti hdc=GetDC(hwnd); if (!hdc) return 0; // Valitse pikseliformaatti PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cRedBits=8; pfd.cGreenBits=8; pfd.cBlueBits=8; pfd.cAlphaBits=8; pfd.cStencilBits=8; pfd.cDepthBits=16; pfd.iLayerType=PFD_MAIN_PLANE; int pixelFormat; pixelFormat=ChoosePixelFormat(hdc, &pfd); if (!pixelFormat) return 0; if (!SetPixelFormat(hdc, pixelFormat, &pfd)) return 0; // Luo renderöintikonteksti HGLRC hrc; hrc=wglCreateContext(hdc); if (!hrc) return 0; if (!wglMakeCurrent(hdc, hrc)) return 0; // Tuo ikkuna näkyviin ShowWindow(hwnd, SW_SHOW); SetForegroundWindow(hwnd); SetFocus(hwnd); // Palauta onnistuminen return 1; } // Pääfunktio int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Luo ikkuna if (!luoIkkuna(800, 600, "OpenGL:n perusteet - Osa 3: Teksturointi")) return 0; // Teksturointi päälle glEnable(GL_TEXTURE_2D); // Tyhjennä puskuri glClear(GL_COLOR_BUFFER_BIT); // Piirretään tausta // Luo 2D koordinaatisto glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 800, 0, 600); // Aseta modelview-matriisi glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Ota alpha test pois päältä sitä ei tarvita taustassa glDisable(GL_ALPHA_TEST); //Tämä on se kuva GLuint texture = pngBind("kuva.png", PNG_BUILDMIPMAPS, PNG_ALPHA, 0, GL_REPEAT, GL_LINEAR, GL_LINEAR); if (!texture) cout << "Ei toimi, texture ei toimi."; cin.get(); return 0; // Sido taustatekstuuri glBindTexture(GL_TEXTURE_2D, texture); // Piirrä koko ikkunan peittävä nelikulmio glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2f(0, 0); glTexCoord2f(6, 0); glVertex2f(800, 0); glTexCoord2f(6, 4); glVertex2f(800, 600); glTexCoord2f(0, 4); glVertex2f(0, 600); glEnd(); // Vaihda puskuri näytölle. SwapBuffers(hdc); return 0; }
Linker errorilla ei ole mitään tekemistä kääntäjän kanssa. Hyvinhän tuo kääntyy (mutta ei se tietenkään toimi kovin järkevästi, kun siinä ei ole pääsilmukkaa ja tekstuurin tarkistuksesta puuttuu aaltosulut. Ja ota iostream ja stdio pois, kun et niitä tarvitse.
Linker error tahtoo sanoa, että et ole linkittänyt jotakin kirjastoa. Eli mikähän linker error?
Jos Dev-C++:ssaa käytät, projektin asetuksista löytyvään linker options -ruutuun pitää laittaa ainakin -lglpng ja -lopengl32.
[linker error] Unresolved external 'pngBind' plaaplaaplaa. Käytän Borlandia, koska Dev-cppn kääntäjää en saa toimimaan.
Glpng-kirjasto pitää siitä huolimatta linkittää. Luulisin, että Borland tykkää enemmän VC++:n versiosta, ja jos ei, sen voi ensin yrittää muuntaa coff2omf-ohjelmalla, joka löytyy Borlandin bin-kansiosta. Tai sitten joudut kääntämään sen itse.
Mutta siis Add to Project ja sitten kaivat sen lib-tiedoston.
Ööh, mikä .lib-tiedosto pitää linkittää siis? Entäs coff2omf-ohjelma, miten sitä käytetään? Yritin linkittää, mutta se ei auttanut.
Metabolix kirjoitti:
Jos Dev-C++:ssaa käytät, projektin asetuksista löytyvään linker options -ruutuun pitää laittaa ainakin -lglpng ja -lopengl32.
Miten tuo tehdään Borlandissa?
No glpng.lib tietenkin. OpenGL oli selvästikin mukana, kun siitä ei tullut valituksia.
Noniin, linkitin glpng.libin, mutta errori tuli liittyen coff2omf-ohjelmaan (ilmeisesti). Tässä se:
[linker error]'...\LIB\GLPNG.LIB' contains inavalid OMF record, type 0x21 (possibly coff)
Elikkä se pitäisi ensin muuntaa coff2omf-ohjelmalla coff-formaatista OMF-formaattiin. Yleensä tuollaisia muunnosohjelmia on varsin suoraviivaista käyttää komentoriviltä käsin, eli etköhän onnistu siinä aivan itsekin.
Mites sitten Dev-C++:ssa DirectX? Eli mitä siihen pitää linkittää, että sen saa toimiin? Jos vaikka haluisin ddraw.h:n funktioita käytettyä. Vai onko sillä erityisesti merkitystä mitä sitten pitää linkitettyä mukaan?
En ole tutustunut directX:ään mutta jos se linkittämistä vaatii niin ddrawi.h:lla on varmasti saman niminen lib tiedosto eli se linkitysparametri on tällöin -lddraw.
Eipä vaikuta toimivan. :/
Jaa, mitähän funktioita vaikuttaisi vielä puuttuvan? Kannattaa vilkaista lib-kansioon, jos kiinnostaa, mitä on käytettävissä.
Metabolix kirjoitti:
Elikkä se pitäisi ensin muuntaa coff2omf-ohjelmalla coff-formaatista OMF-formaattiin. Yleensä tuollaisia muunnosohjelmia on varsin suoraviivaista käyttää komentoriviltä käsin, eli etköhän onnistu siinä aivan itsekin.
Hehe... Komentorivi on poistettu käytöstä, joten siitä ei ole apua. :/ Harmin paikka...
Yleensä command.com toimii kuitenkin, kun tekee siihen pikakuvakkeen. Näin ainakin koulun koneilla.
Kokeilin kääntää Visual C++ :lla sen saman koodipätkän, ja sain vain yhden virheilmoituksen:
--------------------Configuration: OpenGL - Win32 Debug--------------------
Compiling...
plaaplaa.cpp
c:\program files\microsoft visual studio\myprojects\opengl\plaaplaa.cpp(181) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.
plaaplaa.obj - 1 error(s), 0 warning(s)
Säädä projektin asetuksista Precompiled Headers pois päältä (Not Using Precompiled Headers).
Aihe on jo aika vanha, joten et voi enää vastata siihen.