1. Prefácio:
Delphi suporta OpenGl por padrão. Você pode usar a unidade OpenGL para referenciá-lo e, em seguida, usar funções OpenGL. OpenGl é multiplataforma e o Windows há muito o suporta e integra ao sistema Opengl32.dll existe no system32 e não requer instalação adicional. Embora o próprio Windows tenha d3d, seus recursos são limitados e há relativamente poucas páginas de material de aprendizagem relacionadas.
Normalmente o OpenGL suporta apenas as seguintes formas geométricas básicas: pontos, linhas e polígonos . Nenhuma superfície ou gráfico de nível superior (como esferas) pode ser desenhado como elemento gráfico básico. Mas eles podem ser perfeitamente simulados usando polígonos. Dê uma olhada casual nos jogos 3D modernos e você verá que eles são construídos quase inteiramente a partir de triângulos. Portanto, não estamos sujeitos a esta limitação.
2. Inicialização
Antes de usar OpenGL, você precisa definir alguns parâmetros relacionados. O processo geral é:
"Definir formato de pixel correspondente" (ChoosePixelFormat, SetPixelFormat)
"Criar um novo contexto de renderização OpenGL" (wglCreateContext)
"Definir parâmetros relacionados ao OpenGL", "Desenho" (glBegin, glEnd)
"Excluir contexto de renderização OpenGL" (wglDeleteContext)
procedimento TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin Com pfd comece nSize := sizeof(TPIXELFORMATDESCRIPTOR); PFD_DOUBLEBUFFER; // suporta buffer duplo iPixelType := PFD_TYPE_RGBA; // tipo de cor cColorBits := 24; // profundidade de cor preferida cGreenShift := 0; := 0;cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // sem buffer alfa cAccumBits := 0; cAccumRedBits := 0; = 0; cDepthBits := 16; // buffer de profundidade cStencilBits := 0; // sem buffer de estêncil cAuxBuffers := 0; // sem buffers auxiliares iLayerType := dwDamageMask := 0; =GetDC(Handle); ChoosePixelFormat(FDC, @pfd); se pixelFormat = 0 então Sair; se não for SetPixelFormat(FDC, pixelFormat, @pfd) então Sair; para O parâmetro preto é RGBA glClearColor(0, 0, 0, 0); //Definir a projeção ortográfica da matriz de transformação de visualização glMatrixMode(GL_PROJECTION); //Redefinir a matriz atualmente especificada para a matriz de identidade glLoadIdentity; //Especificar OpenGL para desenhar nesta área glViewPort(0, 0, ClientWidth, ClientHeight); Definir o intervalo do sistema de coordenadas mundiais gluOrtho2D(0, ClientWidth, ClientHeight, 0); Mude o objeto de transformação de matriz para a transformação de visualização do modelo glMatrixMode(GL_MODELVIEW); //Redefinir a matriz atualmente especificada para a matriz de identidade glLoadIdentity;end;
3. Desenho
As primitivas básicas do OpenGL são pontos, linhas, polígonos, etc. Cada vez que você desenha, você precisa usar glBegin() e glEnd(). Por exemplo, o seguinte procedimento de função de desenho Draw;
procedimento TForm1.Draw;begin // Limpa o buffer glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); // Limpa o buffer glColor3ub(0, 255, 0); ; //Transmite as três coordenadas dos vértices do triângulo para OpenGL glVertex2f(400, 300); glVertex2f(300, 150); SwapBuffers(FDC); //Troca o conteúdo do buffer duplo, que copiará os gráficos recém-desenhados para a tela. fim;
4. Finalmente, lembre-se de liberar . Todo o código é o seguinte:
unit Unit1;faz interface com Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, OpenGL;tipo TForm1 = class(TForm) procedimento FormCreate(Sender: TObject); Remetente: TObject); procedimento FormResize(Remetente: TObject); private { Declarações privadas } FDC: HDC; FHRC: HGLRC; procedimento Draw; public { Declarações públicas } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Draw;begin // Limpa o buffer glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//Informa ao OpenGL que o triângulo será desenhado glVertex2f(200, 300); //Transfere as três coordenadas do vértice do triângulo para o OpenGL glVertex2f(400, 300); glEnd; //Termina o desenho do yuan da imagem. SwapBuffers(FDC); //Troca o conteúdo do buffer duplo, que copiará os gráficos recém-desenhados para a tela. end;procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin Com pfd comece nSize := sizeof(TPIXELFORMATDESCRIPTOR); // tamanho nVersion := 1; PFD_DRAW_TO_WINDOW ou PFD_DOUBLEBUFFER; // suporta buffer duplo iPixelType := PFD_TYPE_RGBA; // tipo de cor cColorBits := 24; // profundidade de cor preferida cRedBits := 0; ;cGreenShift := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // sem buffer alfa cAccumBits := 0; cAccumRedBits := 0; = 0; cAccumAlphaBits := 0; cDepthBits := 16; cStencilBits := 0; // sem buffer de estêncil cAuxBuffers := 0; // sem buffers auxiliares iLayerType := PFD_MAIN_PLANE; // camada principal bReserved := 0; ;FDC := GetDC(HandleFormat); := ChoosePixelFormat(FDC, @pfd); se pixelFormat = 0 então Sair; se não SetPixelFormat(FDC, pixelFormat, @pfd) então Sair := wglCreateContext(FDC); A cor é preta e o parâmetro é RGBA glClearColor(0, 0, 0, 0); //Definir a projeção ortográfica da matriz de transformação de visualização glMatrixMode(GL_PROJECTION); //Redefinir a matriz atualmente especificada para a matriz de identidade glLoadIdentity; //Especificar OpenGL para desenhar nesta área glViewPort(0, 0, ClientWidth, ClientHeight) ; //Definir o intervalo do sistema de coordenadas mundiais gluOrtho2D(0, ClientWidth, ClientHeight, 0); Mude o objeto de transformação de matriz para a transformação de visualização do modelo glMatrixMode(GL_MODELVIEW); //Redefinir a matriz atualmente especificada para a matriz de identidade glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, wglDeleteContext(); FHRC ); ReleaseDC(Handle, FDC);fim;procedimento TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //Especifica novamente a área de desenho quando a janela muda de tamanho glClearColor(0, 0, 0, 0); ) ; glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW);
Clique aqui para baixar o código completo