[OpenGL] Création d'un contexte OpenGL 2

Le côté programmation du développement d'un jeu vidéo.

Création d'un contexte OpenGL 2

Messagepar francis77 » 07 Oct 2011, 14:37

Je veux créer un contexte OpenGL 2 mais tout ce que j'obtiens en exécutant mes programmes sont des lignes noires qui flash sur la fenêtre.

Comment on crée-t-on un contexte OpenGL 2 ?

Si vous avez besoin de plus de détails, laissez-le moi savoir.
francis77
Hello World, I'm new !
 
Messages: 4
Inscription: 06 Oct 2011, 21:46

Messagepar Thelvyn » 07 Oct 2011, 17:49

Salut,

Peux tu expliquer dans quel cadre t'en as besoin ? En général j'utilisais une bibliothèque comme glfw, ou bien la SDL. Si t'as besoin de faire ça "à la main" sous windows tu peux regarder sur nehe, pour linux j'ai toujours utilisé une des bibliothèques citées.
CoDito, ergo sum...
Avatar de l’utilisateur
Thelvyn
 
Messages: 488
Inscription: 31 Mai 2005, 20:40

Messagepar CodyX » 07 Oct 2011, 18:47

Tu peux aussi montrer ton code pour voir comment tu fais ..
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52

Code pour mon contexte OpenGL 2

Messagepar francis77 » 08 Oct 2011, 06:21

Salut, je préférais utiliser Win32. J'ai vu le site nehe mais je pense que ça n'initialise qu'un contexte OpenGL 1. Voici ce que j'utilise pour créer mon contexte.

Code: Tout sélectionner
#include <windows.h>
#pragma hdrstop

#include <tchar.h>
#include <sys\timeb.h>
#include <float.h>                // _control87(MCW_EM, MCW_EM);
#include <gl/gl.h>
#include "resource.h"
#include "initGL.h"
#include "GLExtensions.h"


//---------------------------------------------------------------------------

#pragma comment( lib, "opengl32.lib" )

/* Prototypes... */

LRESULT APIENTRY WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitOpenGLAPI(HWND hWnd, HDC hDC);
void InitEntryPoints(HWND hwnd, const PIXELFORMATDESCRIPTOR &pfd);
BOOL InitPixelFormatARB(HDC hDC, int iBPP, PIXELFORMATDESCRIPTOR *pfd);
static BOOL PrepareOpenGL(HANDLE, RECT *clientrect);


HWND hWnd;
HINSTANCE hInst;

#pragma argsused
WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    char           AppName[] = "GL";
    MSG            msg;
    WNDCLASS       wndclass;
    HMODULE        Module = NULL;

    hInst = hInstance;

    _control87(MCW_EM, MCW_EM);

    if (!hPrevInstance)
    {
        wndclass.style         = 0;
        wndclass.lpfnWndProc   = WndProc;
        wndclass.cbClsExtra    = 0;
        wndclass.cbWndExtra    = 0;
        wndclass.hInstance     = hInstance;
        wndclass.hIcon         = NULL;
        wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
        wndclass.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU1);
        wndclass.lpszClassName = "GL";

        RegisterClass (&wndclass) ;
    }

    hWnd = CreateWindow (AppName, "GL",
                        WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        HWND_DESKTOP, NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT APIENTRY WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC = NULL;
    PIXELFORMATDESCRIPTOR pfd;

    switch (message)
    {
        case WM_CREATE:
            hDC = GetDC(hWnd);

            InitOpenGLAPI(hWnd, hDC);

            return 0;
        ...
    }

    return DefWindowProc(hWnd, message, wParam, lParam);

}


BOOL InitOpenGLAPI(HWND hWnd, HDC hDC)
{
    HGLRC hRC = NULL;
    BOOL bResult;
    HINSTANCE hInst;

    PIXELFORMATDESCRIPTOR pfdARB = {sizeof (PIXELFORMATDESCRIPTOR),    1,
                    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,    PFD_TYPE_RGBA,
                    8,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    24, 8,
                    0, PFD_MAIN_PLANE, 0, 0, 0, 0
                };
    HWND hWnd;

    hInst = (HINSTANCE) (LONG_PTR) GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
    WNDCLASS wincl;
    wincl.hInstance = hInst;
    wincl.lpszClassName = "GLA";
    wincl.lpfnWndProc = DefWindowProc;
    wincl.style = 0;
    wincl.hIcon = NULL;
    wincl.hCursor = NULL;
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = NULL;
    RegisterClass(&wincl);

    hWnd = CreateWindow("GLAPI", "GLA", WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, 8, 8, HWND_DESKTOP, NULL, hInst, NULL);
    InitEntryPoints(hWnd, pfdARB);

    SendMessage(hWnd, WM_CLOSE, 0, 0);

    if (InitPixelFormatARB(hDC, GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES), &pfdARB))
    {
        hRC = wglCreateContext(hDC);

        bResult = wglMakeCurrent(hDC, hRC);
        if (bResult)
        {
            initExtensions();
            initWGLExtensions(hDC);
        }
    }

    return bResult;
}


void InitEntryPoints(HWND hwnd, const PIXELFORMATDESCRIPTOR &pfd){
    HDC hdc = GetDC(hwnd);
    SetPixelFormat(hdc, ChoosePixelFormat(hdc, &pfd), &pfd);

    HGLRC hglrc = wglCreateContext(hdc);
    wglMakeCurrent(hdc, hglrc);
    initWGLExtensions(hdc);

    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hglrc);
    ReleaseDC(hwnd, hdc);
}

BOOL InitPixelFormatARB(HDC hDC, int iBPP, PIXELFORMATDESCRIPTOR *pfd)
{

    BOOL Result;
    int accumBits = 0;

    int iAttribs[17] = {
        WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
        WGL_ACCELERATION_ARB,   WGL_FULL_ACCELERATION_ARB,
        WGL_DOUBLE_BUFFER_ARB,  GL_TRUE,
        WGL_COLOR_BITS_ARB,     pfd->cColorBits,
        WGL_DEPTH_BITS_ARB,     pfd->cDepthBits,
        WGL_STENCIL_BITS_ARB,   pfd->cStencilBits,
        WGL_ACCUM_BITS_ARB,     accumBits
    };

    int formats[256];
    unsigned int nformats;
    wglChoosePixelFormatARB(hDC, iAttribs, NULL, sizeof(formats) / sizeof(int), formats, &nformats); Result = SetPixelFormat(hDC, formats[0], pfd);

   return Result

}


static BOOL PrepareOpenGL(HANDLE hWnd, RECT *clientrect)
{
    if (clientrect->bottom <= 0)
        return FALSE;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -20.0f);

    glViewport(0, 0, clientrect->right - clientrect->left, clientrect->bottom - clientrect->top);

    Initialize();

    return TRUE;
}
francis77
Hello World, I'm new !
 
Messages: 4
Inscription: 06 Oct 2011, 21:46

Messagepar CodyX » 09 Oct 2011, 17:49

Il manque l'appel à PrepareOpenGL() :)
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52

Appel à PrepareOpenGL()

Messagepar francis77 » 09 Oct 2011, 18:37

C'est appelé dans WM_SIZE. Ce qui me paraissait le plus important était la façon dont j'initialisais OpenGL.

Qu'est-ce qui ne fonctionne pas dans ma façon de l'initialiser ?
francis77
Hello World, I'm new !
 
Messages: 4
Inscription: 06 Oct 2011, 21:46

Messagepar CodyX » 10 Oct 2011, 13:16

Oui dans le wm_size c'est bien mais c'est facultatif perso mon code ne fonctionne pas si il n'y a pas un 2e appel en toute fin d'init avant la boucle de rendu.
Je ne comprend pas non plus les 2 appels à CreateWindow ?
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52

CreateWindow

Messagepar francis77 » 10 Oct 2011, 19:13

Il faut créer une fenêtre bidon pour obtenir les extensions OpenGL. En ayant les extensions, il faut supprimer la fenêtre bidon et créer la fenêtre avec le contexte OpenGL 2. C'est ce que j'ai pu comprendre avec mes recherches sur Internet.
francis77
Hello World, I'm new !
 
Messages: 4
Inscription: 06 Oct 2011, 21:46

Messagepar CodyX » 10 Oct 2011, 20:29

En fait la méthode que tu cites c'est pour obtenir le multisampling avec
wglChoosePixelFormatARB.

Bref soit tu ne l'utilises pas, soit tu l'utilises avant l'appel à SetPixelFormat et il faut virer ChoosePixelFormat dans ce cas qui devient inutile et qui t'évite de créer 2 fois le contexte comme je vois dans ton code.
Bon courage :)
Avatar de l’utilisateur
CodyX
Hello World, I'm new !
 
Messages: 526
Inscription: 10 Avr 2005, 02:52


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

cron