1. Prólogo:
Delphi admite OpenGl de forma predeterminada. Puede usar la unidad usa OpenGL para hacer referencia a él y luego puede usar las funciones OpenGL. OpenGl es multiplataforma y Windows lo admite e integra en el sistema desde hace mucho tiempo. Opengl32.dll existe en system32 y no requiere instalación adicional. Aunque Windows tiene d3d, sus capacidades son limitadas y hay relativamente pocas páginas de material de aprendizaje relacionado.
Por lo general, OpenGL solo admite las siguientes formas geométricas básicas: puntos, líneas y polígonos . No se pueden dibujar superficies ni gráficos de nivel superior (como esferas) como elementos gráficos básicos. Pero se pueden simular perfectamente utilizando polígonos. Eche un vistazo casual a los juegos 3D modernos y verá que están construidos casi en su totalidad a partir de triángulos. Por lo tanto, no estamos sujetos a esta limitación.
2. Inicialización
Antes de usar OpenGL, debe configurar algunos parámetros relacionados. El proceso general es:
"Establecer formato de píxel coincidente" (ChoosePixelFormat, SetPixelFormat)
"Crear un nuevo contexto de representación OpenGL" (wglCreateContext)
"Establecer parámetros relacionados con OpenGL", "Dibujo" (glBegin, glEnd)
"Eliminar contexto de representación OpenGL" (wglDeleteContext)
procedimiento TForm1.FormCreate(Remitente: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;comenzar con pfd comenzar nSize := sizeof(TPIXELFORMATDESCRIPTOR); // tamaño nVersion := 1 // versión dwFlags := PFD_SUPPORT_OPENGL o PFD_DRAW_TO_WINDOW o PFD_DOUBLEBUFFER; // admite doble buffer iPixelType := PFD_TYPE_RGBA; // tipo de color cColorBits := 24 // profundidad de color preferida cRedBits := 0; := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // sin búfer alfa cAccumBits := 0; cAccumRedBits := 0; cAccumAlphaBits := 0; = 0; cDepthBits := 16; // búfer de profundidad cStencilBits := 0; // sin búfer de plantilla cAuxBuffers := 0; // sin búferes auxiliares iLayerType := PFD_MAIN_PLANE; // capa principal bReserved := 0; = ObtenerDC(Manejar); formato de píxel := ChoosePixelFormat(FDC, @pfd); si pixelFormat = 0, entonces Salir; si no, SetPixelFormat(FDC, pixelFormat, @pfd) entonces Salir; = wglCreateContext(FDC); a El parámetro negro es RGBA glClearColor(0, 0, 0, 0); //Establece la proyección ortográfica de la matriz de transformación de la vista glMatrixMode(GL_PROJECTION); //Restablece la matriz especificada actualmente a la matriz de identidad glLoadIdentity; //Especifica OpenGL para dibujar en esta área glViewPort(0, 0, ClientWidth, ClientHeight); Establecer el rango del sistema de coordenadas mundial gluOrtho2D(0, ClientWidth, ClientHeight, 0); Cambie el objeto de transformación de matriz a la transformación de vista de modelo glMatrixMode(GL_MODELVIEW); //Restablezca la matriz actualmente especificada a la matriz de identidad glLoadIdentity;end;
3. Dibujo
Las primitivas básicas de OpenGL son puntos, líneas, polígonos, etc. Cada vez que dibujas, necesitas usar glBegin() y glEnd(). Por ejemplo, el siguiente procedimiento de función de dibujo Dibujar;
procedimiento TForm1.Draw;begin // Limpiar el búfer glClear(GL_COLOR_BUFFER_BIT o GL_DEPTH_BUFFER_BIT); // Limpiar el búfer glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES); ; //Transmitir las coordenadas de los tres vértices del triángulo a OpenGL glVertex2f(400, 300); glVertex2f(300, 150); //Finalizar el dibujo de primitivas. SwapBuffers(FDC); //Intercambia el contenido del búfer doble, que copiará los gráficos recién dibujados en la pantalla. fin;
4. Por último, recuerda soltar . El código completo es el siguiente:
unidad Unidad1; interfaz utiliza Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios, Diálogos, OpenGL; escriba TForm1 = clase (TForm) procedimiento FormCreate (Remitente: TObject procedimiento FormDestroy (Remitente: TObject procedimiento FormPaint); Remitente: TObject); procedimiento FormResize(Remitente: TObject); privado { Declaraciones privadas } FDC: HDC; FHRC: HGLRC; procedimiento Draw; public { Declaraciones públicas } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Draw;begin // Borrar el búfer glClear(GL_COLOR_BUFFER_BIT o GL_DEPTH_BUFFER_BIT); glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//Dile a OpenGL que se va a dibujar el triángulo glVertex2f(200, 300); //Transfiere las coordenadas de los tres vértices del triángulo a OpenGL glVertex2f(400, 300); glEnd; // Finaliza el dibujo del yuan. SwapBuffers(FDC); //Intercambia el contenido del búfer doble, que copiará los gráficos recién dibujados en la pantalla. end;procedimiento TForm1.FormCreate(Remitente: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;comenzar con pfd comenzar nSize := sizeof(TPIXELFORMATDESCRIPTOR); // tamaño nVersion := 1 // versión dwFlags := PFD_SUPPORT_OPENGL o PFD_DRAW_TO_WINDOW o PFD_DOUBLEBUFFER // admite doble buffer iPixelType := PFD_TYPE_RGBA; // tipo de color cColorBits := 24 // profundidad de color preferida cRedBits := 0; ; cDesplazamientoVerde:= 0; cBitsAzul:= 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // sin búfer alfa cAccumBits := 0; cAccumRedBits := 0; cAccumGreenBits := 0; = 0; cAccumAlphaBits := 0; cDepthBits := 16 // búfer de profundidad; cStencilBits := 0; // sin búfer de plantilla cAuxBuffers := 0; // sin búferes auxiliares iLayerType := PFD_MAIN_PLANE; // capa principal bReserved := 0; ; FDC := ObtenerDC(Manejar); := ChoosePixelFormat(FDC, @pfd); si pixelFormat = 0, entonces salga; si no, SetPixelFormat(FDC, pixelFormat, @pfd), entonces salga de FHRC := wglCreateContext(FDC); El color es negro y el parámetro es RGBA glClearColor(0, 0, 0, 0); //Establece la proyección ortográfica de la matriz de transformación de la vista glMatrixMode(GL_PROJECTION); //Restablece la matriz especificada actualmente a la matriz de identidad glLoadIdentity //Especifica OpenGL para dibujar en esta área glViewPort(0, 0, ClientWidth, ClientHeight) ; //Establece el rango del sistema de coordenadas mundial gluOrtho2D(0, ClientWidth, ClientHeight, 0); Cambie el objeto de transformación de matriz a la transformación de vista de modelo glMatrixMode(GL_MODELVIEW); //Restablezca la matriz especificada actualmente a la matriz de identidad glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC); ReleaseDC(Mango, FDC);fin;procedimiento TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin // Vuelva a especificar el área de dibujo cuando la ventana cambie de tamaño glClearColor(0, 0, 0, 0), glMatrixMode(GL_PROJECTION); ) ; glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity;end;end;
Haga clic aquí para descargar el código completo