---- Al desarrollar programas de gráficos, especialmente programas de gráficos tridimensionales, elegí DelphiOpenGL porque sentí que OpenGL no era tan complicado como DirectX. En términos de sensación, Delphi no era tan complicado como C ++ y era más fácil de usar. así que elegí Delphi+ que hace el trabajo. En el proceso, encontré (definitivamente) algunos problemas y me gustaría expresar mi esperanza de poder comunicarme con mis amigos.
----El primero es la inicialización. Durante la inicialización, se deben realizar varias tareas: ① Crear una tabla de descripción del dispositivo (Contexto del dispositivo). (Nota: con respecto a DC, las traducciones de varios materiales son diferentes, como el entorno del dispositivo, la tabla de descripción del dispositivo, el contexto del dispositivo, etc., pero no parecen muy apropiadas. Sería fantástico si pudiera haber un traductor como Li Shanlan. La situación de RC a continuación es la misma)②Establezca el formato de píxel correspondiente (PIXELFORMAT DESCRipTOR). ③Cree una tabla de descripción de representación (Contexto de representación). Hay varias formas de obtener o crear tablas de contexto de dispositivos en Delphi. La más sencilla es obtener directamente el atributo de identificador (Handle) del objeto de lienzo (TCanvas), como por ejemplo:
DC: HDC; DC: = Canvas.Handle; también puede utilizar la función API GetDC para obtener la tabla de descripción del dispositivo. Tales como: DC:=GetDC(Manejar, DC);
---- También puede utilizar la función CreateCompatibleDC o BeginPaint..EndPaint (debe prestar atención a la diferencia entre ellas) para obtener la tabla de descripción del dispositivo. Sin embargo, una vez agotada la tabla de descripción del dispositivo, debe recordar liberarla o eliminarla para liberar recursos. Una vez que tenga acceso a la tabla de contexto del dispositivo, puede configurar el formato de píxel correspondiente. El formato píxel es un tipo de registro con algunos campos o campos que son de poca utilidad (al menos por ahora). Una vez completada la descripción del formato de píxeles, llame a las funciones ChoosePixelFormat y SetPixelFormat para hacer coincidir y configurar con la tabla de descripción del dispositivo. Como el siguiente código:
función SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:Integer;begin New(ppfd^.nSize:=sizeof(PIXELFORMATDESCRIPTOR); =PFD_DRAW_TO_WINDOW o PFD_SUPPORT_OPENGL o PFD_DOUBLEBUFFER; ppfd^.dwLayerMask:=PFD_MAIN_PLANE; ppfd^.iPixelType:=ppfd^.cAccumBits:=8; ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); si (nPixelformat=0) comienza MessageBox(NULL, 'elegirPixelFormat falló', 'Error', MB_OK Resultado:=False; ; si (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) luego comience MessageBox(NULL, 'SetPixelFormat falló', 'Error', MB_OK); también puede configurarlo de la siguiente manera: var; pfd: PixelFormatDescriptor; nPixelFormat: entero; comenzar FillChar(pfd,SizeOf(pfd),0); con pfd comience nSize:=sizeof(pfd); nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL o PFD_DRAW_TO_BITMAP o PFD_DOUBLEBUFFER:=PFD_TYPE_RGBA; cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); fin; nPixelFormat:=ChoosePixelFormat(DC,@pfd); Utilice DescribePixelFormat para comprobar si el formato de píxeles está configurado correctamente. DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); si (pfd.dwFlags y PFD_NEED_PALETTE) < > 0 entonces SetupPalette(DC,pfd);//SetupPalette es un función personalizada }fin;
---- Una vez completado el trabajo anterior, es mejor ejecutarlo nuevamente y verificar el valor de nPixelFormat. Normalmente, este valor debe ser mayor que 0, de lo contrario habrá un problema. Para el mismo código, puedo obtener el valor correcto mayor que 0 en la máquina NT pero no el valor correcto en la máquina PWIN97 o 98. Sin embargo, no habrá ningún problema al compilar, y después de compilar en NT, también puede ser. utilizado en la máquina PWIN97 Ejecute correctamente. Ahora es el momento de crear el contexto de sombreado (RC). Llame a las funciones wglCreateContext y wglMakeCurrent, como se muestra en el siguiente ejemplo:
RC: HGLRC; RC:=wglCreateContext(DC); wglMakeCurrent(DC,RC); antes de que finalice el programa, recuerde liberar los recursos ocupados. wglMakeCurrent(0,0); si RC< >null entonces wglDeleteContext(RC); si ghDC< >null entonces ReleaseDC(Handle,DC);
---- El siguiente código está adaptado del ejemplo de OpenGL en C++Builder 4. El tamaño del programa compilado es de aproximadamente 300 K, mientras que el tamaño del programa compilado en C ++ Builder 4 es 384 K.
---- < a href="061403-05.zip ">Código de programa Zip 3KB
---- Las funciones OpenGL y el formato de píxeles en el programa se explican en detalle en MSHelp en Delphi. Este artículo no se atreve a explicar más.