Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: DirectX

Sivun loppuun

Sweiz [22.02.2006 12:50:05]

#

Yksinkertaisesti: Kääntyykö DirectX Borlandilla? Olen ymmärtänyt, että DirectX ei käänny muualla kuin Microsoft Visual C++ :lla.

feenix [22.02.2006 13:04:50]

#

Borland C++ Builderilla? Apua saattaa löytyä tuolta:

http://www.elvenware.com/charlie/DirectX/

Metabolix [22.02.2006 15:32:55]

#

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 ;)

Sweiz [22.02.2006 20:19:35]

#

OpenGL :ssä ei varmasti vikaa, mutta Suomenkielistä opasta on turha hakea.

Heikki [22.02.2006 22:17:29]

#

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.

Spongi [22.02.2006 22:17:30]

#

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

Sweiz [22.02.2006 22:43:28]

#

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.html

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.

Metabolix [22.02.2006 22:52:37]

#

Miten yrität sen kääntää?

rutkis [23.02.2006 09:22:19]

#

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.

Sweiz [23.02.2006 15:24:10]

#

Tallennan ohjelman ja käännän ihan vain klikkaamalla RUN.

Metabolix [23.02.2006 15:55:20]

#

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.

Sweiz [23.02.2006 16:22:27]

#

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?WikiID=1&p=CppBuilderLinkingErrors&rev=2

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

Metabolix [23.02.2006 16:25:56]

#

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.

Sweiz [23.02.2006 16:57:46]

#

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

Metabolix [23.02.2006 17:09:20]

#

Kuulostaa kyllä siltä, että kääntäjässä on jotakin vikaa. Minulla nuo toimivat Borlandin vastaavalla kokeiluversiolla aivan hyvin.

Sweiz [23.02.2006 17:17:19]

#

Ei siinä pitäisi mitään vikaa olla. Perusohjelmat toimivat ihan hyvin. Suomipelit.comin vastaavat esimerkit toimii...

Sweiz [24.02.2006 18:55:45]

#

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ä.

Metabolix [24.02.2006 19:00:03]

#

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.

Sweiz [24.02.2006 19:04:05]

#

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ä.

Metabolix [24.02.2006 19:10:30]

#

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...

Sweiz [24.02.2006 19:26:58]

#

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.

Metabolix [24.02.2006 19:40:59]

#

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.

Sweiz [24.02.2006 20:46:17]

#

Oisko vielä käytännön esimerkki?

Metabolix [24.02.2006 20:55:33]

#

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

Sweiz [26.02.2006 00:49:31]

#

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;
}

Metabolix [26.02.2006 16:39:04]

#

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.

Sweiz [26.02.2006 20:03:34]

#

[linker error] Unresolved external 'pngBind' plaaplaaplaa. Käytän Borlandia, koska Dev-cppn kääntäjää en saa toimimaan.

Metabolix [27.02.2006 03:51:39]

#

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.

Sweiz [03.03.2006 16:52:09]

#

Öö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?

Metabolix [05.03.2006 15:21:42]

#

No glpng.lib tietenkin. OpenGL oli selvästikin mukana, kun siitä ei tullut valituksia.

Sweiz [06.03.2006 15:25:08]

#

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)

Metabolix [07.03.2006 16:39:47]

#

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.

verho88 [13.03.2006 09:05:59]

#

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?

rndprogy [13.03.2006 10:39:05]

#

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.

verho88 [15.03.2006 15:45:18]

#

Eipä vaikuta toimivan. :/

Metabolix [17.03.2006 01:43:32]

#

Jaa, mitähän funktioita vaikuttaisi vielä puuttuvan? Kannattaa vilkaista lib-kansioon, jos kiinnostaa, mitä on käytettävissä.

Sweiz [17.03.2006 14:37:15]

#

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...

Metabolix [17.03.2006 18:22:49]

#

Yleensä command.com toimii kuitenkin, kun tekee siihen pikakuvakkeen. Näin ainakin koulun koneilla.

Sweiz [18.03.2006 19:40:55]

#

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)

Metabolix [19.03.2006 12:46:40]

#

Säädä projektin asetuksista Precompiled Headers pois päältä (Not Using Precompiled Headers).


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta