Open GL - Lo tengo todo!!.. por qué no se muestra el render?

 
Vista:
Imágen de perfil de killgates

Lo tengo todo!!.. por qué no se muestra el render?

Publicado por killgates (2 intervenciones) el 22/01/2015 02:58:39
Hola,
Este es mi primer mensaje. Acabo de dar con la web. En principio encantado de conoceros.

Tengo un problema con mi programa de opengl. Acabo de empezar hace un tiempo. Tengo el problema de que la ventana que creo para el contexto de render se queda como colgada con el icono del reloj, y no se muestra el render,
he utilizado el modo inmediato. Total, si no paso de aquí.
Os pongo el código que he hecho:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//PROGRAMA QUE CREA UNA PANTALLA Y LA CONECTA CON UN CONTEXTO DE RENDER.. PARA MOSTRAR UN POLIGONO
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glext.h>
#include <windows.h>
#include <iostream>
#include <cstdio>
#include <ctime>
 
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)  //Esta función siempre se crea siempre con estos argumentos
{                                           //hwnd será el manejador de la ventana que ha generado el mensaje. Diferencia las distintas ventanas
    switch(msg)                             //.. de una misma clase y, del mismo wndproc.
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        //case WM_CREATE:
        //break;
        case WM_CREATE:
            puts("creada");
            break;
        default:
            puts("mensaje default");
            return DefWindowProc(hwnd, msg, wParam, lParam);
        break;
    }
    return 0;
}
 
 
int WINAPI WinMain(HINSTANCE m_hinstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int cmdShow){
 
 
//.....................variables.....................
    HWND m_hwnd; //esto es la ventana
    HDC m_hdc;   //esto es el contexto de dispositivo
    HGLRC m_hglrc;
 
    DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
    DWORD dwStyle = WS_OVERLAPPEDWINDOW; //
    const int AnchoPantalla = 1000;
    const int AltoPantalla =  1000;
 
 
//AHORA CREO LA CLASE DE VENTANA: ...................         //ANTES DE CREAR LA VENTANA SE HA DE CREAR LA CLASE DE VENTANA
    WNDCLASSEX m_windowClass;      // Crea la estructura tipo clase ventana
    m_windowClass.cbSize          = sizeof(WNDCLASSEX); //tamaño de la estructura del tipo wndclassex
    m_windowClass.style           = CS_HREDRAW | CS_VREDRAW;
    m_windowClass.lpfnWndProc     = WndProc; //Esta es la funcion que procesa los eventos en la ventana
    m_windowClass.cbClsExtra      = 0;
    m_windowClass.cbWndExtra      = 0;
    m_windowClass.hInstance       = m_hinstance;  //Esta es la instancia a la cual pertenece la ventana, normalmente la instancia que se le pasa a winmain()
    m_windowClass.hIcon           = LoadIcon(NULL, IDI_APPLICATION);  // default icon que se muestra al pulsar alt+tab
    m_windowClass.hCursor         = LoadCursor(NULL, IDC_ARROW);      // default arrow Handle al cursor que será mostrado sobre la ventana.
    m_windowClass.hbrBackground   = NULL;         // Pincel para fijar el color de fondo de nuestra ventana.
    m_windowClass.lpszMenuName    = NULL;                             // no menu
    m_windowClass.lpszClassName   = "ClaseVentana";                   // nombre para identificar la clase
    m_windowClass.hIconSm         = LoadIcon(NULL, IDI_WINLOGO);      // Handle al ícono pequeño (16x16), usado en la barra de tareas y en la esquina superior izquierda de la ventana.
 
    if (!RegisterClassEx(&m_windowClass)){
        MessageBox(NULL, "Falla Registro Ventana", NULL, MB_OK);
        exit(1);
    }
//Fin clase ventana...................................
 
//Estructura de tipo RECT       ESTO ES UNA ESTRUCTURA QUE CONTIENE 4 DATOS: left, right, top y bottom
    RECT m_windowRect;
    m_windowRect.left = (long)0;
    m_windowRect.right = (long)AnchoPantalla;
    m_windowRect.top = (long)0;
    m_windowRect.bottom = (long)AltoPantalla;
//.......................
 
    const int windowBPP = 16;
    const int windowFullscreen = false;
 
    AdjustWindowRectEx(&m_windowRect, dwStyle, false, dwExStyle);
 
    m_hwnd = CreateWindowEx(NULL, "ClaseVentana", "Capitulo 2 OpenGL", dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
        0, 0, m_windowRect.right - m_windowRect.left, m_windowRect.bottom - m_windowRect.top, NULL, NULL, m_hinstance, NULL);
 
    if (m_hwnd == NULL){
        MessageBox(NULL, "No se puede crear la ventana de opengl", "Ha ocurrido un error", MB_ICONERROR | MB_OK);
        exit(1);
    }
 
    m_hdc = GetDC(m_hwnd);
    ShowWindow(m_hwnd, SW_SHOW);
    UpdateWindow(m_hwnd);
 
//..............................................
//ESTA PARTE CREA LA VARIABLE DE TIPO PIXELFORMAT.. CON IDENTIFICADOR PFD.. Y LUEGO LA RELLENO
    PIXELFORMATDESCRIPTOR pfd;
    pfd =
     {
        sizeof(PIXELFORMATDESCRIPTOR),  // size
            1,                          // version
            PFD_SUPPORT_OPENGL |        // OpenGL window
            PFD_DRAW_TO_WINDOW |        // render to window
            PFD_DOUBLEBUFFER,           // support double-buffering
            PFD_TYPE_RGBA,              // color type
            32,                         // prefered color depth
            0, 0, 0, 0, 0, 0,           // color bits (ignored)
            0,                          // no alpha buffer
            0,                          // alpha bits (ignored)
            0,                          // no accumulation buffer
            0, 0, 0, 0,                 // accum bits (ignored)
            16,                         // depth buffer
            0,                          // no stencil buffer
            0,                          // no auxiliary buffers
            PFD_MAIN_PLANE,             // main layer
            0,                          // reserved
            0, 0, 0,                    // no layer, visible, damage masks
    };
//...............................
 
    int pixel_format;
    pixel_format = ChoosePixelFormat(m_hdc, &pfd);          //!!!SUPER IMPORTANTE!!! CHOOSEPIXELFORMAT REQUIERE LIBRERÍA: GDI32 || EN EL LINKER
    SetPixelFormat(m_hdc, pixel_format, &pfd);
 
//....Esto crea el contexto de render a partir de lo anterior....................................................
 
    m_hglrc = wglCreateContext(m_hdc);
    wglMakeCurrent(m_hdc, m_hglrc);
    if (!m_hglrc){
        puts("NO se ha podido crear el contexto del render");
        getchar();
        exit(1);
    }
 
 
    glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
 
	glBegin(GL_TRIANGLES);
		glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
	    glVertex3f(-1.0f, -0.5f, -4.0f);
		glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
		glVertex3f(1.0f, -0.5f, -4.0f);
		glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
		glVertex3f(0.0f,  0.5f, -4.0f);
	glEnd();
	getchar();
 
}

Gracias,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder