» »

OpenGL problem

OpenGL problem

fx ::

#include <windows.h>
#include <gl/gl.h>

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;        
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;

    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "OpenGL";
    RegisterClass (&wc);
    
    hWnd = CreateWindow (
      "OpenGL", "OpenGL 3D3kotnik", 
      WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
      0, 0, 640, 640,
      NULL, NULL, hInstance, NULL);

    EnableOpenGL (hWnd, &hDC, &hRC);


    while (!bQuit)
    {
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
        else
        {

            glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
            glClear (GL_COLOR_BUFFER_BIT);

            glPushMatrix ();
            glRotatef (theta, 0.0f, 1.0f, 1.0f);
            glBegin (GL_TRIANGLES);
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
            
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //
            
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //D            
            
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //D  
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
            glEnd ();
            
            glPopMatrix ();
            SwapBuffers (hDC);

            theta += 0.1f;
            Sleep (1);
        }
    }

    DisableOpenGL (hWnd, hDC, hRC);
    DestroyWindow (hWnd);
    return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage (0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
        }
        return 0;

    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;

    *hDC = GetDC (hWnd);

    ZeroMemory (&pfd, sizeof (pfd));
    pfd.nSize = sizeof (pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
    PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    iFormat = ChoosePixelFormat (*hDC, &pfd);
    SetPixelFormat (*hDC, iFormat, &pfd);

    *hRC = wglCreateContext( *hDC );
    wglMakeCurrent( *hDC, *hRC );

}

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);
}
Koda lepo deluje in sem :D, samo nevem kaj je narobe, ker ko se mi 3D 3kotnik vrti se mi naredi še en trikotnik, potem to ven izgleda tako, kot da bi bil trikotnik zgoraj odrezan, tega ne želim imeti. Sem mogoče naredil začetniško napako v OpenGL.

lp

Senitel ::

Moraš spucat še Z-buffer...
glClearDepth (1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Nerdor ::

Kako pa ta program prevedem pod Visual Studio.Net 2003 !? Se da ta program prevesti pod konzolo!? Sem googlal, pa nikakor nisem dobil pravega odgovora kako prevesti ta program, ki uporablja gl.h. Tako pod VS.Net kot Konzolo! Prevede mi, samo mi ne zgradi opengl1.exe. Kako se pripravi tak program, da se prevede!?

PS: lastnik sem ATi Radeon-a 8500. Ali moram kakšen ATi OpenGL SDK inštalirati!?=
... for lifetime!

Vesoljc ::

ccc...

glej, ena cela sticky tema je o c++ povezavah, notri je tudi grafika zajeta...
Abnormal behavior of abnormal brain makes me normal...

fx ::

Senitel kdaj moram z-buffer spucat, pred ali po izvedmi ali vmes med izvajanjem programa?

Link do mojega programa

lp

Senitel ::

Ja za vsak frame moraš spucat Z-buffer...
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT);

zamenjaš z:
glClearDepth (1.0);
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

In ker nisem čisto ziher ali OpenGL že sam od sebe vklopi Z-buffer, dodaj še
glEnable(GL_DEPTH_TEST);

v del kode, ki inicializira OpenGL

Nerdor ::

Za vse tiste, ki tole spremljate in se sprašujete, kako za se tole prevede, sem izvohal po 1h googlanja tole spletno stran http://www.students.uwosh.edu/~bradfj23/visualstudio/.
Ja koda se prevede. Vendar nisem čisto upošteval nasvete iz omenjenega linka. Ubistvu sem sam dodal : "Project" -> "ImePrograma Properties" -> "Linker -> Input" in tam pri prvi postavki "Additional Dependencies" vpisal "opengl32.lib glu32.lib". Tako da ni bilo potrebno downloadat GLUT 3.7.6 in vse nastavljati po tistem tutorialu.:)
... for lifetime!

fx ::

Senitel nič se ne spremeni, razen če dodam glEnable(GL_DEPTH_TEST); potem se mi pojavijo deke črne črte.

lp

fx ::

glEnable(GL_DEPTH_TEST); moram dati na pravo mesto potem lepo deluje.
Hvala vsem za pomoč.

lp

fx ::

Kako naredim svojo matriko oz. trenutno matriko razdelim na manjše delce?

lp

Gundolf ::

Matrika je tabela 16 doublov ali floatov. V njej so elementi napisani po stolpcih. Potem pa jo loadaš z ukazom tipa glLoadMatrixd (to govorim totalno na pamet). Nimam pa pojma kaj misliš z deljlenjem matrike na delce.

A ti je že kdo predlagal da si poglej tutoriale na NeHe?

fx ::

Ker če pogledaš ta del kode:
            glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A
            glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f);  //B
            glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C

Kar je med -1 in 1 je vidno na monitroju, kar je nad ena se ne vidi, to se vidi lepo takoj ko zaženem program in jaz želim, da bi se v celoti to videlo?

> A ti je že kdo predlagal da si poglej tutoriale na NeHe?
Ni, ker sem si jo sam prej poiska, samo kako naj med 114 ukazi vem kateri je pravi?

Senitel ::

V tistem tvojem programu niti ne nastavljaš kamere... V bistvu imaš tudi nekaj clipinga z near cliping planeom... Nevem glih točno kako ima OpenGL to po defaultu urejeno...
Zdej to da je od -1 in 1 vidno na monitorju drastično zavisi od tega kolk daleč imaš ti objekt. Če ga imaš zelo blizu, bo morda že -1 do 1 izven zaslona, če imaš objekt zelo daleč še -1000, 1000 ne bo izven zaslona.
Koliko imaš znanja o linearni algebri (matrike & stuff)?

fx ::

Kamero ?!? Nikjer nisem nikoli prebral da bi mogle uporabiti kamero.

lp

Gundolf ::

Zato si pa poglej NeHe tutoriale (na levi imaš menujček z dostopom do 48 kratkih tutorialov). Ker samo poznavanje ukazov ne bodo nič pomagalo. Rabiš poznati principe (npr. 'kamera').

fx ::

Kako z OpenGL narediš ohranjevalnik zaslona, za linux vem da gre kako pa je za Win32?

lp

Nerdor ::

Stari recept, za screen saver je bil takšen. Napraviš program, ki bo uporabil celoten zaslon, pri tem bo deloval pri isti resoluciji in frekvenci, kot je prej. (torej tvoj program ne sme spremeniti nič v zvezi monitorja. Sicer lahko napraviš, samo boš uporabnika "prestrašil" ko bo začel menjavati resolucijo.)

Ubistvu navaden *.exe, ki se fizično preimenuje v *.src in se ga skopira v c:\windows\tam-kjer-so-ostrali-scr\*.scr

No možno se je še pozanimati, katero okno v Control Panel prikazuje screensaverje in kako med seboj komunicirajo (kako izmenjujejo msg). In to je to!
... for lifetime!

fx ::

Kako v OpenGl nastavim da mi progam uporabi celotni zaslon neglede na ločljivost.

Lp

user4683 ::

AAAaaaaaaaa!!
Že 526212x so te usmerili k NeHejevim tutorialom... Noben tukaj ni plačan, da bi bil tvoj osebni tutor, glede na tvoje spraševanje pa zgleda kot da hočeš ravno to.
Brat NeHejeve tutoriale, ko pa prideš do vsaj 10., se pa ponovno oglasi z vprašanji.

fx ::

Sem že rešil s NeHe za full screen.

lp

fx ::

Samo nekaj me zanima, kako pa OpenGL dela z miško, ker bi rad naredil ko premakneš miško greš ven iz programa. Tega pa ni na NeHe, ker sem gledal.

Lp

Gundolf ::

Tudi to je na NeHe. Čeprav OpenGL nima nobene povezave z miško. OpenGL ti le skrbi za grafiko. Tako da za miško moraš poskrbet sam in sicer v okolju v katerem delaš (Win, X, GLut, SDL, ...)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

tekstura [c++ opengl]

Oddelek: Programiranje
9911 (696) matej94
»

[c++]OpenGL izris kvadrata

Oddelek: Programiranje
81270 (1130) Mavrik
»

C++ programirane v Open GL oz. Direct x

Oddelek: Programiranje
242976 (2247) Vesoljc
»

OpenGL orr v ansi c

Oddelek: Programiranje
121637 (1425) igor12

Več podobnih tem