Fecha y hora actual: Martes 20 Nov 2018 02:13
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Paso a Paso .. Como crear ventana en windows .. Para OpenGl

Responder al Tema

Índice del Foro > Programación de juegos o videojuegos > Paso a Paso .. Como crear ventana en windows .. Para OpenGl

Autor Mensaje
killgates
Usuario Iniciado


Registrado: 25 Nov 2013
Mensajes: 26

Mensaje Publicado: Martes 30 Dic 2014 02:39

Título del mensaje: Paso a Paso .. Como crear ventana en windows .. Para OpenGl

Responder citando

Hola Amigos,

Llevo unas semanas(casi un mes) leyendo un libro bastante chulo que me he comprado: "Programación de videojuegos con OpenGL" (segunda edición).

Después de aprender un poco de c++, he decidido aprender openGL

Voy por el capítulo 4.. Y Tengo algunas dudas.. Con la práctica..


El compilador codeblocks me devuelve error del tipo:
undefined reference to '_ChoosePixelFormat@8'
undefined reference to '_SetPixelFormat@12'

..cuando compilo el inicio del programa que contiene la estructura del pixel "PIXELFORMATDESCRIPTOR".
Creo una variable del tipo "PIXELFORMATDESCRIPTOR" llamada "pfd", luego relleno los datos básicos..
Mejor os lo enseño:

Código:
//PROGRAMA QUE CREA UNA PANTALLA Y LA CONECTA CON UN CONTEXTO DE RENDER.. PARA MOSTRAR UN POLIGONO

#include <windows.h>
#include <iostream>


int main(){
    HDC hdc; //Dispositivo grafico
    int pixelformat=0;
    const int AnchoPantalla = 1024;
    const int AltoPantalla = 768;
    const int windowBPP = 16;
    const int windowFullscreen = false;


    //ESTA PARTE CREA LA VARIABLE DE TIPO PIXELFORMAT.. Y LUEGO RELLENO LA estructura pfd
    PIXELFORMATDESCRIPTOR pfd;
    //memset(&pfd, 0, sizeof(pfd));

    pfd.nSize= sizeof(PIXELFORMATDESCRIPTOR);    //Esto es el tamaño de la estructura
    pfd.dwFlags= PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.nVersion= 1;    //Siempre a 1.. Por que?
    pfd.iPixelType= PFD_TYPE_RGBA;  //El tipo de color de pixel.. Es este caso reg green blue..
    pfd.cColorBits= 16;
    //pfd.lpfnWndProc= ProcesaEventos;
    pfd.iLayerType =PFD_MAIN_PLANE;

    pixelformat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, pixelformat, &pfd);

}


Bueno, es el principio.. peró es que sin él no puedo continuar
Gracias

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Jueves 01 Ene 2015 01:29

Título del mensaje: Paso a Paso .. Como crear ventana en windows .. Para OpenGl

Responder citando

killgates escribió:
undefined reference to '_ChoosePixelFormat@8


Ese tipo de errores, que hacen referencia al nombre de una función acompañado de algún caracter especial tipo arroba y similar, indican que falta alguna librería que hay que vincular al enlazador o linker.

Seguramente se trate de la librería lopengl32.dll o lglu32, etc.

Suerte y gran regalo de reyes ese libro que mencionas Guiño
Ok

https://www.opengl.org/sdk/libs/

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
killgates
Usuario Iniciado


Registrado: 25 Nov 2013
Mensajes: 26

Mensaje Publicado: Jueves 01 Ene 2015 21:31

Título del mensaje: Paso a Paso .. Como crear ventana en windows .. Para OpenGl

Responder citando

Hola,

Gracias por responder whiteskull..

Puff La verdad me está costando la práctica de crear un programa con opengl..

Resulta que primero he de crear la ventana en Windows con:
CreateWindowsEx();

Luego mostrarla..

Luego vincularla al contexto de dispositivo del modo:
m_hwnd = CreateWindowsEx(...);
m_hdc = GetDC(m_hwnd);

Luego establecer la estructura pixelformatdescriptor.. como antes mencioné..

Y finalmente crear el contexto de render con wgl del modo:
wglcreatecontext();

Y luego establecer el contexto actual


Pffff... Cuuuesta lo suyo.

Saludos... Super

Volver arriba
Ver perfil del usuario Enviar mensaje privado
killgates
Usuario Iniciado


Registrado: 25 Nov 2013
Mensajes: 26

Mensaje Publicado: Viernes 06 Feb 2015 19:42

Título del mensaje: Paso a Paso .. Como crear ventana en windows .. Para OpenGl

Responder citando

Hola que hay,

He seguido avanzando con la teoría del opengl, voy por los shaders.
Con la práctica voy muy atrasado. La verdad es que estoy atascado en el principio. He coseguido
todo lo que sería la base del programa (ventana, contextos...) y cuando quiero dibujar algo se compila pero en la ventana se ve blanco.
He probado a añadir el evento del click izquierdo en la ventana y funciona. Eso me hace pensar que está todo bien menos el render.

Porfavor a ver si me podeis indicar qué está mal, gracias.

la fuente es ésta:
Código:
#include <ctime>
#include <iostream>
#include <windows.h>
#include <GL/gl.h>
#include "glu.h"

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
            puts("ventana creada");
        break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR cmdLine,
                   int cmdShow){

//comienza el programa..
  DWORD      dwExStyle;       // Window Extended Style
  DWORD      dwStyle;         // Window Style

    const int width = 1024;
    const int height = 768;
    const int bpp = 16;
    const int fullscreen = 0;

  bool m_isFullscreen = fullscreen; //Store the fullscreen flag
    RECT m_windowRect;
    m_windowRect.left = (long)0; // Set Left Value To 0
    m_windowRect.right = (long)width; // Set Right Value To Requested Width
    m_windowRect.top = (long)0;  // Set Top Value To 0
    m_windowRect.bottom = (long)height;   // Set Bottom Value To Requested Height

    WNDCLASSEX m_windowClass;
    // fill out the window class structure
    m_windowClass.cbSize          = sizeof(WNDCLASSEX);
    m_windowClass.style           = CS_HREDRAW | CS_VREDRAW;
    m_windowClass.lpfnWndProc     = WndProc; //We set our static method as the event handler
    m_windowClass.cbClsExtra      = 0;
    m_windowClass.cbWndExtra      = 0;
    m_windowClass.hInstance       = GetModuleHandle(NULL);
    m_windowClass.hIcon           = LoadIcon(NULL, IDI_APPLICATION);  // default icon
    m_windowClass.hCursor         = LoadCursor(NULL, IDC_ARROW);      // default arrow
    m_windowClass.hbrBackground   = NULL;                             // don't need background
    m_windowClass.lpszMenuName    = NULL;                             // no menu
    m_windowClass.lpszClassName   = "GLClass";
    m_windowClass.hIconSm         = LoadIcon(NULL, IDI_WINLOGO);      // windows logo small icon

    // register the windows class
    if (!RegisterClassEx(&m_windowClass))
    {
        return false;
    }

    if (m_isFullscreen) //If we are fullscreen, we need to change the display mode
    {
        DEVMODE dmScreenSettings;                   // device mode

        memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
        dmScreenSettings.dmSize = sizeof(dmScreenSettings);

        dmScreenSettings.dmPelsWidth = width;         // screen width
        dmScreenSettings.dmPelsHeight = height;           // screen height
        dmScreenSettings.dmBitsPerPel = bpp;             // bits per pixel
        dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

        if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
        {
            // setting display mode failed, switch to windowed
            MessageBox(NULL, "Display mode failed", NULL, MB_OK);
            m_isFullscreen = false;
        }
    }

    if (m_isFullscreen)                             // Are We Still In Fullscreen Mode?
    {
        dwExStyle = WS_EX_APPWINDOW;                  // Window Extended Style
        dwStyle = WS_POPUP;                       // Windows Style
        ShowCursor(false);                      // Hide Mouse Pointer
    }
    else
    {
        dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // Window Extended Style
        dwStyle = WS_OVERLAPPEDWINDOW;                    // Windows Style
    }

    AdjustWindowRectEx(&m_windowRect, dwStyle, false, dwExStyle);     // Adjust Window To True Requested Size

    // class registered, so now create our window
    HWND m_hwnd = CreateWindowEx(dwExStyle,                                 // extended style
        "GLClass",                          // class name
        "BOGLGP - Chapter 6 - Terrain Rendered using GLSL",      // app name
        dwStyle | WS_CLIPCHILDREN |
        WS_CLIPSIBLINGS,
        0, 0,                               // x,y coordinate
        m_windowRect.right - m_windowRect.left,
        m_windowRect.bottom - m_windowRect.top, // width, height
        NULL,                               // handle to parent
        NULL,                               // handle to menu
        hInstance,                          // application instance
        NULL);                              // we pass a pointer to the GLWindow here

    // check if window creation failed (hwnd would equal NULL)
    if (!m_hwnd)
        return 0;


//....................................contexto render y pfd
    /*
    PIXELFORMATDESCRIPTOR pfd;
    memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.nVersion = 1;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    pfd.iLayerType = PFD_MAIN_PLANE;
        */

    static    PIXELFORMATDESCRIPTOR pfd=
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        32,
        0, 0, 0, 0, 0, 0,
        0,
        0,
        0,
        0, 0, 0, 0,
        32,
        0,
        0,
        0,
        0,
        0, 0, 0
    };

    HDC hdc = GetDC(m_hwnd);
    ShowWindow(m_hwnd, SW_SHOW);          // display the window
    UpdateWindow(m_hwnd);                 // update the window

    int pixelFormat;
    pixelFormat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, pixelFormat, &pfd);
    MSG Msg;

    HGLRC m_hglrc=wglCreateContext(hdc);
    wglMakeCurrent(hdc,m_hglrc);
    UpdateWindow(m_hwnd);

    if (!m_hglrc)
        puts("No se ha creado el contexto de render");

int VENTANA_ANCHO = width;
int VENTANA_ALTO = height;
//*******************INICIALIZAR*********
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glMatrixMode (GL_PROJECTION);
    glViewport (0, 0, VENTANA_ANCHO , VENTANA_ALTO);
    //gluPerspective(45.0f,VENTANA_ANCHO/VENTANA_ALTO,0.1f,100.0f);
    //gluLookAt( 0,0,16,  0,0,0, 0,1,0);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
//***********************RENDER***********************
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(3.0f,-2.0f,0.0f);
    glVertex3f(0.0f,1.0f,0.0f);
    glVertex3f(-3.0f,-2.0f,0.0f);
    glEnd();
//*********************FIN DE RENDER*****************

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

}

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

¿como puedo obtener un dato de un radiobutton

jose mansilla Programación para dispositivos móviles 0 Jueves 27 Sep 2018 16:08 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Tutorial Python Rápido para Principiantes

Errodringer Python 0 Viernes 14 Sep 2018 19:38 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Consulta sobre un tipo de PLUGIN para insertar ...

Federico Jose Temas generales 1 Sábado 08 Sep 2018 18:57 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Resolver elementos de páginas web en ventana de...

desparche Python 0 Jueves 06 Sep 2018 02:07 Ver último mensaje
El foro no contiene ningún mensaje nuevo

ayuda ayuda para este codigo que me sale error ...

DiegoBV C, C#, Visual C++ 0 Jueves 02 Ago 2018 23:52 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,