1. Prefácio:
Para Delphi, se você quiser fazer desenhos, você precisa processá-los primeiro e fazer referência a outras unidades, que não estão incluídas no Delphi, então você precisa baixar Gl.pas separadamente. A unidade OpenGl comumente encontrada na Internet está encapsulada na versão 1.0 e esta função não é declarada. As unidades Gl.pas podem ser encontradas online. Além disso, são necessárias uma unidade Glaux.pas e glaux.dll, que são bibliotecas auxiliares. Um download será fornecido no final deste artigo.
2. Processo de implementação:
Pintar quadros requer os seguintes processos. O próprio desenho do Windows é baseado em bitmaps, como png, jpg, etc. Ao desenhar, ele pode ser convertido para bmp e depois desenhado.
1. Carregue imagens bmp: use auxDIBImageLoadA ou outras funções
2. Converta para textura: glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri é usado para definir parâmetros relacionados
3. Desenhe textura: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. Desenhe usando a função glDrawPixels
glDrawPixels tem os 5 parâmetros a seguir:
largura: largura da imagem da tabela
height: altura da imagem da tabela
formato: formato de armazenamento de dados de imagens de tabela
tipo: desconhecido
pixels: ponteiro para dados DIB
O código de exemplo é o seguinte:
procedimento TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; / Os dados da imagem do TBitmap são armazenados continuamente na memória na ordem inversa das linhas. O primeiro endereço, que é o endereço do buffer da imagem, pode ser obtido através de TBitmap.ScanLine[TBitmap.Height-1] // A cor da imagem bmp é. armazenado em bgr, então você precisa selecionar GL_BGR_EXT como parâmetro glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Altura - 1]);
Você não precisa ativar o mapeamento de textura para desenhar imagens usando o método acima. Você pode usar a função glPixelZoom para ampliar a imagem. A posição de exibição está no canto inferior esquerdo da janela (não sei como alterar a imagem). posição por enquanto.)
3. Use desenho de textura
Se quiser controlar a posição de exibição e o zoom da imagem, você pode usar os seguintes métodos.
1. De acordo com o processo, primeiro carregamos a imagem no programa e obtemos as informações relevantes da imagem .
Para carregar imagens em texturas, consulte este site://www.VeVB.COm/article/52125.htm
Carregar um bitmap no Delphi é muito simples e pode ser carregado das seguintes maneiras:
(1) Carregue a imagem através da função auxDIBImageLoadA da biblioteca auxiliar. O retorno é um ponteiro de dados PTAUX_RGBImageRec e o formato de dados DIB é RGB.
// Estrutura de dados RGB TAUX_RGBImageRec = tamanho do registro .bmp')); Como liberar p? Nem Dispose nem Freemem podem operar este ponteiro;
(2) Carregue imagens através de TBitmap.LoadFromFile. Delphi vem com ele. Em uma comparação de eficiência, o desempenho é o mesmo do auxDIBImageLoadA, mas o formato de dados DIB é BGR e o ponteiro DIB é TBitmap.ScanLine[Bmp.Height - 1]
var Bmp: TBitmap;begin Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp');
2. Crie uma textura , incluindo glGenTextures e glBindTexture, em Gl.pas.
// Cria uma área de textura glGenTextures(1, @texture); // Vincula a área de textura glBindTexture(GL_TEXTURE_2D, Texture); // Use um bitmap para criar uma textura de imagem glTexImage2D( GL_TEXTURE_2D, // A textura é uma textura 2D GL_TEXTURE_2D 0, // O nível de detalhe da imagem é padronizado como 0 3, // O número de componentes dos dados Como a imagem é composta por vermelho, verde e azul, o padrão é 3 Bmp.Width, // A largura da textura Bmp.Height, // A altura da textura é 0, /. / O valor da borda é 0 por padrão GL_BGR_EXT, // O formato de dados bmp usa bgr GL_UNSIGNED_BYTE, // Os dados que compõem a imagem são do tipo byte não assinado Bmp.ScanLine[Bmp.Height - 1] // Dados DIB. ponteiro); // As duas linhas a seguir permitem que o opengl use o método de filtragem que o OpenGL usa ao ampliar a textura original (GL_TEXTURE_MAG_FILTER) ou reduzir a textura original (GL_TEXTURE_MIN_FILTER). // GL_LINEAR usa filtragem linear para suavizar o processamento da imagem, mas requer mais memória e CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtragem linear glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3. Desenhe textura
Antes de desenhar uma textura, o OpenGL deve ser notificado para ativar o mapeamento de textura glEnable(GL_TEXTURE_2D). Quando ativado, o desenho sem textura não funcionará. Apenas lembre-se de fechá-lo quando terminar de usá-lo.
// O seguinte é o desenho, usando um quadrilátero para desenhar uma imagem // Habilita o mapeamento de textura se glIsEnabled(GL_TEXTURE_2D) = 0 then glEnable(GL_TEXTURE_2D); // Limpa o buffer glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); := 10; Amplie a imagem para 200*200 // Selecione a textura. Se múltiplas texturas forem usadas na cena, a textura não pode ser vinculada entre glBegin() e glEnd() glBindTexture(GL_TEXTURE_2D, Texture); de glTexCoord2f Um parâmetro é a coordenada X. // 0.0 é o lado esquerdo da textura. 0,5 é o ponto médio da textura e 1,0 é o lado direito da textura. //O segundo parâmetro de glTexCoord2f é a coordenada Y. // 0.0 é a parte inferior da textura. 0,5 é o ponto médio da textura e 1,0 é o topo da textura. glTexCoord2f(0, 1); glTexCoord2f(l + w, t + w); 0, 0); glEnd();
O desenho acima acabou. A seguir está o código completo no Draw. Você não precisa fazer referência à biblioteca auxiliar Glaux.pas.
procedimento TForm1.Draw;var Bmp: TBitmap textura: GLuint; / Cria área de textura glGenTextures(1, @texture); Vincule a área de textura glBindTexture(GL_TEXTURE_2D, Texture); // Use um bitmap para criar uma textura de imagem glTexImage2D( GL_TEXTURE_2D, // A textura é uma textura 2D GL_TEXTURE_2D 0, // O nível de detalhe da imagem é padronizado como 0 3, / / O número de componentes dos dados Como a imagem é composta por vermelho, verde e azul, o padrão é 3 Bmp.Width, //. A largura da textura Bmp.Height, // A altura da textura é 0, // O valor padrão da borda é 0 GL_BGR_EXT, // O formato de dados bmp usa bgr GL_UNSIGNED_BYTE, // Os dados que compõem a imagem é o tipo de byte não assinado Bmp.ScanLine[Bmp .Height - 1] // ponteiro de dados DIB); As duas linhas a seguir permitem que o opengl use o método de filtragem que o OpenGL usa ao ampliar a textura original (GL_TEXTURE_MAG_FILTER) ou reduzir a textura original (GL_TEXTURE_MIN_FILTER). // GL_LINEAR usa filtragem linear para suavizar o processamento da imagem, mas requer mais memória e CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtragem linear glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); A seguir está o desenho, usando um quadrilátero para desenhar uma imagem // Habilita o mapeamento de textura se glIsEnabled(GL_TEXTURE_2D) = 0 then glEnable(GL_TEXTURE_2D); // Limpa o buffer glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); 10;C:= 200; Amplie a imagem para 200*200 // Selecione a textura. Se múltiplas texturas forem usadas na cena, a textura não pode ser vinculada entre glBegin() e glEnd() glBindTexture(GL_TEXTURE_2D, Texture); de glTexCoord2f Um parâmetro é a coordenada X. // 0.0 é o lado esquerdo da textura. 0,5 é o ponto médio da textura e 1,0 é o lado direito da textura. //O segundo parâmetro de glTexCoord2f é a coordenada Y. // 0.0 é a parte inferior da textura. 0,5 é o ponto médio da textura e 1,0 é o topo da textura. glTexCoord2f(0, 1); glTexCoord2f(l + w, t + w); 0, 0); glEnd();Bmp.Free;
O código completo deste exemplo pode ser baixado aqui.