Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Używanie SDL i OpenGL

Ostatnio zmodyfikowano 2011-09-13 19:53
Autor Wiadomość
m4tx
» 2011-09-13 16:27:22
No nie żartuj sobie DejaVu... :P To tak jakby instalator Windowsa instalował również Linuksa ;)

http://lmgtfy.com/?q=opengl+visual+c%2B%2B

Lol... to jest taka bibliteka jak sdl_opengl? Po co? O_o to można w czystym SDLu zrobić...
P-40906
programista12
Temat założony przez niniejszego użytkownika
» 2011-09-13 16:35:44
Zastosowałem się do tego z linku powyżej, ale kompilator wywala błąd:

1>------ Build started: Project: OpenGL Test, Configuration: Release Win32 ------
1>Embedding manifest...
1>mt.exe : general error c10100b1: Failed to load file ".\Release\OpenGL Test.exe". Nie mo|na odnalez okre[lonego pliku.
1>Build log was saved at "file://j:\Dokumenty\Visual Studio 2008\Projects\OpenGL Test\Release\BuildLog.htm"
1>OpenGL Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Kod:
C/C++
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

HWND hWnd;
HDC hDC;
HGLRC hRC;

// Set up pixel format for graphics initialization
void SetupPixelFormat()
{
    PIXELFORMATDESCRIPTOR pfd, * ppfd;
    int pixelformat;
   
    ppfd = & pfd;
   
    ppfd->nSize = sizeof( PIXELFORMATDESCRIPTOR );
    ppfd->nVersion = 1;
    ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    ppfd->dwLayerMask = PFD_MAIN_PLANE;
    ppfd->iPixelType = PFD_TYPE_COLORINDEX;
    ppfd->cColorBits = 16;
    ppfd->cDepthBits = 16;
    ppfd->cAccumBits = 0;
    ppfd->cStencilBits = 0;
   
    pixelformat = ChoosePixelFormat( hDC, ppfd );
    SetPixelFormat( hDC, pixelformat, ppfd );
}

// Initialize OpenGL graphics
void InitGraphics()
{
    hDC = GetDC( hWnd );
   
    SetupPixelFormat();
   
    hRC = wglCreateContext( hDC );
    wglMakeCurrent( hDC, hRC );
   
    glClearColor( 0, 0, 0, 0.5 );
    glClearDepth( 1.0 );
    glEnable( GL_DEPTH_TEST );
}

// Resize graphics to fit window
void ResizeGraphics()
{
    // Get new window size
    RECT rect;
    int width, height;
    GLfloat aspect;
   
    GetClientRect( hWnd, & rect );
    width = rect.right;
    height = rect.bottom;
    aspect =( GLfloat ) width / height;
   
    // Adjust graphics to window size
    glViewport( 0, 0, width, height );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 45.0, aspect, 1.0, 100.0 );
    glMatrixMode( GL_MODELVIEW );
}

// Draw frame
void DrawGraphics()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   
    // Set location in front of camera
    glLoadIdentity();
    glTranslated( 0, 0, - 10 );
   
    // Draw a square
    glBegin( GL_QUADS );
    glColor3d( 1, 0, 0 );
    glVertex3d( - 2, 2, 0 );
    glVertex3d( 2, 2, 0 );
    glVertex3d( 2, - 2, 0 );
    glVertex3d( - 2, - 2, 0 );
    glEnd();
   
    // Show the new scene
    SwapBuffers( hDC );
}

// Handle window events and messages
LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
    case WM_SIZE:
        ResizeGraphics();
        break;
       
    case WM_CLOSE:
        DestroyWindow( hWnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        // Default event handler
        default:
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
        break;
    }
   
    return 1;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    const LPCWSTR appname = TEXT( "OpenGL Sample" );
   
    WNDCLASS wndclass;
    MSG msg;
   
    // Define the window class
    wndclass.style = 0;
    wndclass.lpfnWndProc =( WNDPROC ) MainWndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon( hInstance, appname );
    wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndclass.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wndclass.lpszMenuName = appname;
    wndclass.lpszClassName = appname;
   
    // Register the window class
    if( !RegisterClass( & wndclass ) ) return FALSE;
   
    // Create the window
    hWnd = CreateWindow(
    appname,
    appname,
    WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    800,
    600,
    NULL,
    NULL,
    hInstance,
    NULL );
   
    if( !hWnd ) return FALSE;
   
    // Initialize OpenGL
    InitGraphics();
   
    // Display the window
    ShowWindow( hWnd, nCmdShow );
    UpdateWindow( hWnd );
   
    // Event loop
    while( 1 )
    {
        if( PeekMessage( & msg, NULL, 0, 0, PM_NOREMOVE ) == TRUE )
        {
            if( !GetMessage( & msg, NULL, 0, 0 ) ) return TRUE;
           
            TranslateMessage( & msg );
            DispatchMessage( & msg );
        }
        DrawGraphics();
    }
   
    wglDeleteContext( hRC );
    ReleaseDC( hWnd, hDC );
}
P-40907
m4tx
» 2011-09-13 16:40:39
1>mt.exe : general error c10100b1: Failed to load file ".\Release\OpenGL Test.exe". Nie mo|na odnalez okre[lonego pliku.
A to już jest błąd Visuala :P
P-40909
programista12
Temat założony przez niniejszego użytkownika
» 2011-09-13 16:46:20
Dobra. Na stronie lazyfoo.net znalazłem o używaniu OpenGL z SDL i już działa. Ale mam pytanie: Czy w ten sposób da się normalnie uczyć OpenGL?
P-40911
kamillo121
» 2011-09-13 16:48:06
Lol... to jest taka bibliteka jak sdl_opengl? Po co? O_o to można w czystym SDLu zrobić...
Nie to nie jest biblioteka, jest to jeden nagłówek(z tego co pamiętam), który wchodzi w skład biblioteki SDL. Jeżeli ma bibliotekę SDL zainstalowaną to zapewne ma nagłówek sdl_opengl...
Co to znaczy normalnie ? jak chcesz poznać samego OpenGL to się go ucz a nie kombinuj z SDL. Jak się nauczysz dobrze OpenGL'a to potem możesz sobie SDL użyć np do wczytywania obrazów z różnymi rozszerzeniami czy tam do czego będziesz chciał.
P-40912
m4tx
» 2011-09-13 16:57:25
E tam od razu "kombinuj". Ja się uczę OpenGLa wykorzystując SFMLa do utworzenia okna, zdarzeń itd. i nie narzekam ;)

Lol... to jest taka bibliteka jak sdl_opengl? Po co? O_o to można w czystym SDLu zrobić...
Nie to nie jest biblioteka, jest to jeden nagłówek(z tego co pamiętam), który wchodzi w skład biblioteki SDL. Jeżeli ma bibliotekę SDL zainstalowaną to zapewne ma nagłówek sdl_opengl...
A, no chyba że tak :P
P-40914
Gabes
» 2011-09-13 17:05:53
Nauka openGL+WinAPI to droga przez męke bez dobrej znajomości WinAPI.
Ja proponuje Allegro_5+openGL.
P-40916
programista12
Temat założony przez niniejszego użytkownika
» 2011-09-13 17:06:59
Spróbowałem jeszcze raz z samym OpenGL. Z internetu pobrałem glut 3.7.6 i wpakowałem pliki do odpowiednich folderów. Do linkera dałem "opengl32.lib glu32.lib glut32.lib", ale po kompilacji kodu z pierwszej lekcji wywala błędy:

Warning 2 warning C4985: 'exit': attributes not present on previous declaration. I:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdlib.h 371

Error 3 error C3861: 'exit': identifier not found j:\Dokumenty\Visual Studio 2008\Projects\OGL\main.cpp 65
Error 1 error C2381: 'exit' : redefinition; __declspec(noreturn) differs I:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdlib.h 371

Kod:
C/C++
/*
(c) Janusz Ganczarski (Power)
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>

// funkcja generująca scenę 3D

void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
   
    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT );
   
    // kolor kwadratu
    glColor3f( 1.0, 0.0, 0.0 );
   
    // początek definicji wielokąta
    glBegin( GL_POLYGON );
   
    // kolejne wierzchołki wielokąta
    glVertex3f( 0.0, 0.0, 0.0 );
    glVertex3f( 0.0, 1.0, 0.0 );
    glVertex3f( 1.0, 1.0, 0.0 );
    glVertex3f( 1.0, 0.0, 0.0 );
   
    // koniec definicji prymitywu
    glEnd();
   
    // skierowanie poleceń do wykonania
    glFlush();
   
    // zamiana buforów koloru
    glutSwapBuffers();
}

// zmiana wielkości okna

void Reshape( int width, int height )
{
    // generowanie sceny 3D
    Display();
}

// stałe do obsługi menu podręcznego

enum
{
    EXIT // wyjście
};

// obsługa menu podręcznego

void Menu( int value )
{
    switch( value )
    {
        // wyjście
    case EXIT:
        exit( 0 );
    }
}

int main( int argc, char * argv[] )
{
    // inicjalizacja biblioteki GLUT
    glutInit( & argc, argv );
   
    // inicjalizacja bufora ramki
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
   
    // rozmiary głównego okna programu
    glutInitWindowSize( 400, 400 );
   
    // utworzenie głównego okna programu
    glutCreateWindow( "Kwadrat 1" );
   
    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( Display );
   
    // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
    glutReshapeFunc( Reshape );
   
    // utworzenie menu podręcznego
    glutCreateMenu( Menu );
   
    // dodatnie pozycji do menu podręcznego
    #ifdef WIN32
   
    glutAddMenuEntry( "Wyjście", EXIT );
    #else
   
    glutAddMenuEntry( "Wyjscie", EXIT );
    #endif
   
    // określenie przycisku myszki obsługującej menu podręczne
    glutAttachMenu( GLUT_RIGHT_BUTTON );
   
    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
    return 0;
}

EDIT:
Wykomentowałem #include <stdlib> i program działa.
P-40917
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona