如何在C ++ builder中渲染openGL框架?
我想在C ++ builder中的窗体中初始化一个openGL框架。 我试图复制这里给出的OpenGL启动代码的内容: http : //edn.embarcadero.com/article/10528
我尝试用TFrame1replaceTForm1,然后把它放在窗体devise,但它没有工作。 如何正确地做到这一点,任何经验呢?
容易,只需使用TForm::Handle
作为窗口句柄…
这里BCB5的一些古老的例子移植到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(); } //---------------------------------------------------------------------------
-
创build空的1-Form项目
-
将其添加为用户定义的成员的类标题
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();
-
添加计时器〜20-40毫秒
- 创build事件和复制大小,重绘,ontimer,…以匹配上面的源代码的机构
- 编译并运行
笔记
- 并不要求所有OpenGL的东西都是表单类的成员
- 定时器可以有任何间隔
- OpenGL也可以只是整个窗口的一部分
- 可以与VCL组件结合使用(使用面板button等,调整OpenGL到外面的区域)
- 如果你不能让它工作评论我,但我没有看到任何困难的事情…
- 不要忘记包括
gl.h
! - 如果所有的工作,那么你应该看到forms的中心绿色四方
- 鼠标滚轮向前/向后移动相机(“缩放”)
当你准备好去使用OpenGL 1.0时,请看看:
- 完成GL + GLSL + VAO / VBO C ++的例子
玩的开心 …