c++ forms opengl frame c++builder

¿Cómo renderizar un marco OpenGL en C++ Builder?



forms frame (1)

fácil, solo use TForm::Handle como manejador de ventana ...

Aquí un antiguo ejemplo mío en BCB5 portado a BDS2006 :

//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <gl/gl.h> #include <gl/glu.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- int TForm1::ogl_init() { if (ogl_inicialized) return 1; hdc = GetDC(Form1->Handle); // get device context PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); // set the pixel format for the DC 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 = 24; pfd.iLayerType = PFD_MAIN_PLANE; SetPixelFormat(hdc,ChoosePixelFormat(hdc, &pfd),&pfd); hrc = wglCreateContext(hdc); // create current rendering context if(hrc == NULL) { ShowMessage("Could not initialize OpenGL Rendering context !!!"); ogl_inicialized=0; return 0; } if(wglMakeCurrent(hdc, hrc) == false) { ShowMessage("Could not make current OpenGL Rendering context !!!"); wglDeleteContext(hrc); // destroy rendering context ogl_inicialized=0; return 0; } ogl_resize(); glEnable(GL_DEPTH_TEST); // Zbuf glDisable(GL_CULL_FACE); // vynechavaj odvratene steny glDisable(GL_TEXTURE_2D); // pouzivaj textury, farbu pouzivaj z textury glDisable(GL_BLEND); // priehladnost glShadeModel(GL_SMOOTH); // gourard shading glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // background color ogl_inicialized=1; return 1; } //--------------------------------------------------------------------------- void TForm1::ogl_exit() { if (!ogl_inicialized) return; wglMakeCurrent(NULL, NULL); // release current rendering context wglDeleteContext(hrc); // destroy rendering context ogl_inicialized=0; } //--------------------------------------------------------------------------- void TForm1::ogl_draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float x=0.5,y=0.5,z=20.0; glBegin(GL_QUADS); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-x,-y,-z); glVertex3f(-x,+y,-z); glVertex3f(+x,+y,-z); glVertex3f(+x,-y,-z); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-x,-y,+z); glVertex3f(-x,+y,+z); glVertex3f(+x,+y,+z); glVertex3f(+x,-y,+z); glEnd(); glFlush(); SwapBuffers(hdc); } //--------------------------------------------------------------------------- void TForm1::ogl_resize() { xs=ClientWidth; ys=ClientHeight; if (xs<=0) xs = 1; // Prevent a divide by zero if (ys<=0) ys = 1; if (!ogl_inicialized) return; glViewport(0,0,xs,ys); // Set Viewport to window dimensions glMatrixMode(GL_PROJECTION); // operacie s projekcnou maticou glLoadIdentity(); // jednotkova matica projekcie gluPerspective(30,float(xs)/float(ys),0.1,100.0); // matica=perspektiva,120 stupnov premieta z viewsize do 0.1 glMatrixMode(GL_TEXTURE); // operacie s texturovou maticou glLoadIdentity(); // jednotkova matica textury glMatrixMode(GL_MODELVIEW); // operacie s modelovou maticou glLoadIdentity(); // jednotkova matica modelu (objektu) ogl_draw(); } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ogl_inicialized=0; hdc=NULL; hrc=NULL; ogl_init(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { ogl_exit(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormResize(TObject *Sender) { ogl_resize(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormPaint(TObject *Sender) { ogl_draw(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { ogl_draw(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled) { glMatrixMode(GL_PROJECTION); glTranslatef(0,0,+2.0); ogl_draw(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled) { glMatrixMode(GL_PROJECTION); glTranslatef(0,0,-2.0); ogl_draw(); } //---------------------------------------------------------------------------

  1. crear un proyecto vacío de 1 formulario

  2. agregar esto al encabezado de la clase de formulario como sus miembros definidos por el usuario

    int xs,ys; HDC hdc; // device context HGLRC hrc; // rendering context int ogl_inicialized; int ogl_init(); void ogl_exit(); void ogl_draw(); void ogl_resize();

  3. agregar temporizador ~ 20-40 ms

  4. crear eventos y copiar cuerpos para cambiar el tamaño, volver a pintar, ontimer, ... para que coincida con el código fuente anterior
  5. compilar y ejecutar

Notas

  • no se requiere que todas las cosas de OpenGL sean miembros de la clase de formulario
  • el temporizador puede tener cualquier intervalo
  • OpenGL también puede ser solo una parte de una ventana, no solo todo
  • puede combinarse con componentes VCL (use paneles para botones, etc. y cambie el tamaño de OpenGL al área exterior)
  • Si no puede hacerlo funcionar, coménteme, pero no veo nada difícil de hacer ...
  • No te olvides de incluir gl.h !!!
  • si todo funciona, entonces deberías ver quad verde en el centro de la forma
  • la rueda del mouse mueve la cámara hacia adelante / hacia atrás (''zoom'')

Cuando esté listo para irse después de OpenGL 1.0, eche un vistazo a:

  • Ejemplo completo GL + GLSL + VAO / VBO C ++

Que te diviertas ...

Quiero inicializar un marco OpenGL dentro de un formulario en C ++ Builder. Intenté copiar el contenido de este código de inicio de OpenGL proporcionado aquí: http://edn.embarcadero.com/article/10528
Intenté reemplazar TForm1 con TFrame1 y luego ponerlo en el diseño del formulario, pero no funcionó. ¿Cómo hacer esto correctamente, alguna experiencia con esto?