1. Prólogo:
Para Delphi, si desea hacer dibujos, primero debe procesarlos y debe hacer referencia a otras unidades, que no están incluidas en Delphi, por lo que debe descargar Gl.pas por separado. La unidad OpenGl que se encuentra comúnmente en Internet está encapsulada en la versión 1.0 y esta función no está declarada. Las unidades Gl.pas se pueden encontrar en línea. Además, se requiere una unidad Glaux.pas y glaux.dll, que son bibliotecas auxiliares. Se proporcionará una descarga al final de este artículo.
2. Proceso de implementación:
Pintar cuadros requiere los siguientes procesos. El dibujo propio de Windows se basa en mapas de bits, como png, jpg, etc. Al dibujar, se puede convertir a bmp y luego dibujar.
1. Cargue imágenes bmp: use auxDIBImageLoadA u otras funciones
2. Convertir a textura: glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri se usa para establecer parámetros relacionados
3. Dibujar textura: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. Dibuja usando la función glDrawPixels
glDrawPixels tiene los siguientes 5 parámetros:
ancho: ancho de la imagen de la tabla
altura: altura de la imagen de la tabla
formato: formato de almacenamiento de datos de imágenes de tabla
tipo: desconocido
píxeles: puntero a datos DIB
El código de muestra es el siguiente:
procedimiento TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // Borrar el búfer glClear(GL_COLOR_BUFFER_BIT o GL_DEPTH_BUFFER_BIT); / Los datos de la imagen de TBitmap se almacenan continuamente en la memoria en orden de filas inverso. La primera dirección, que es la dirección del búfer de la imagen, se puede obtener a través de TBitmap.ScanLine[TBitmap.Height-1] // El color de la imagen bmp es. almacenado en bgr, por lo que debe seleccionar GL_BGR_EXT como parámetro glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]); SwapBuffers(FDC);
No es necesario habilitar el mapeo de textura para dibujar imágenes usando el método anterior. Puede usar la función glPixelZoom para ampliar la imagen. La posición de visualización está en la esquina inferior izquierda de la ventana (no sé cómo cambiar la imagen). posición por el momento.)
3. Utilice el dibujo de texturas
Si desea controlar la posición de visualización y el zoom de la imagen, puede utilizar los siguientes métodos.
1. Según el proceso, primero cargamos la imagen en el programa y obtenemos la información relevante de la imagen .
Para cargar imágenes en texturas, consulte este sitio://www.VeVB.COm/article/52125.htm
Cargar un mapa de bits en Delphi es muy sencillo y se puede cargar de las siguientes maneras:
(1) Cargue la imagen a través de la función auxDIBImageLoadA de la biblioteca auxiliar. El retorno es un puntero de datos PTAUX_RGBImageRec y el formato de datos DIB es RGB.
// Estructura de datos RGB TAUX_RGBImageRec = tamaño de registro .bmp')); ¿Cómo liberar p? Ni Dispose ni Freemem pueden operar este extremo del puntero;
(2) Cargue imágenes a través de TBitmap.LoadFromFile. Delphi viene con él. Desde una comparación de eficiencia, el rendimiento es el mismo que el de auxDIBImageLoadA, pero el formato de datos DIB es BGR y el puntero DIB es TBitmap.ScanLine[Bmp.Height - 1].
var Bmp: TBitmap;begin Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // hacer algo // Liberar Bmp.Free;end;
2. Cree una textura , incluidas glGenTextures y glBindTexture, en Gl.pas.
// Crea un área de textura glGenTextures(1, @texture); // Vincula el área de textura glBindTexture(GL_TEXTURE_2D, textura); // Usa un mapa de bits para crear una textura de imagen glTexImage2D( GL_TEXTURE_2D, // La textura es una textura 2D GL_TEXTURE_2D 0, // El nivel de detalle de la imagen por defecto es 0 3, // El número de componentes de los datos debido a que la imagen se compone de rojo, verde y azul, el valor predeterminado es 3 Bmp.Width, // El ancho de la textura Bmp.Height, // La altura de la textura es 0, /. / El valor del borde es 0 por defecto GL_BGR_EXT, // El formato de datos bmp usa bgr GL_UNSIGNED_BYTE, // Los datos que componen la imagen son de tipo byte sin firmar Bmp.ScanLine[Bmp.Height - 1] // Datos DIB. puntero); // Las siguientes dos líneas permiten a opengl usar el método de filtrado que usa OpenGL al ampliar la textura original (GL_TEXTURE_MAG_FILTER) o reducir la textura original (GL_TEXTURE_MIN_FILTER). // GL_LINEAR usa filtrado lineal para suavizar el procesamiento de imágenes, pero requiere más memoria y CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtrado lineal glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3. Dibuja textura
Antes de dibujar una textura, se debe notificar a OpenGL para habilitar el mapeo de texturas glEnable (GL_TEXTURE_2D). Cuando está activado, el dibujo sin textura no funcionará. Sólo recuerda cerrarlo cuando termines de usarlo.
// Lo siguiente es dibujar, usando un cuadrilátero para dibujar una imagen // Habilitar el mapeo de textura si glIsEnabled(GL_TEXTURE_2D) = 0 entonces glEnable(GL_TEXTURE_2D); // Borrar el búfer glClear(GL_COLOR_BUFFER_BIT o GL_DEPTH_BUFFER_BIT); := 10; w := 200; Ampliar la imagen a 200*200 // Seleccionar textura. Si se utilizan varias texturas en la escena, la textura no se puede vincular entre glBegin() y glEnd() glBindTexture(GL_TEXTURE_2D, glBegin(GL_QUADS); de glTexCoord2f Un parámetro es la coordenada X. // 0.0 es el lado izquierdo de la textura. 0,5 es el punto medio de la textura y 1,0 es el lado derecho de la textura. //El segundo parámetro de glTexCoord2f es la coordenada Y. // 0.0 es la parte inferior de la textura. 0,5 es el punto medio de la textura y 1,0 es la parte superior de la textura. glTexCoord2f(0, 1); glTexCoord2f(1, 0); glTexCoord2f(l + w, t); 0, 0); glVertex2f(l, t + w); glEnd();
El dibujo anterior ha terminado. El siguiente es el código completo en Draw. No es necesario hacer referencia a la biblioteca auxiliar Glaux.pas.
procedimiento TForm1.Draw;var Bmp: TBitmap; textura: GLuint; l, t, w: Integer;begin Bmp := TBitmap.Create(ExtractFilePath(ParamStr(0)) + '1.bmp'); / Crear área de textura glGenTextures(1, @texture); Vincular el área de textura glBindTexture(GL_TEXTURE_2D, textura); // Usar un mapa de bits para crear una textura de imagen glTexImage2D( GL_TEXTURE_2D, // La textura es una textura 2D GL_TEXTURE_2D 0, // El nivel de detalle de la imagen por defecto es 0 3, / / El número de componentes de los datos. Debido a que la imagen se compone de rojo, verde y azul, el valor predeterminado es 3 Bmp.Width, //. El ancho de la textura Bmp.Height, // La altura de la textura es 0, // El valor del borde por defecto es 0 GL_BGR_EXT, // El formato de datos bmp usa bgr GL_UNSIGNED_BYTE, // Los datos que componen la imagen es el tipo de byte sin firmar Bmp.ScanLine[Bmp .Height - 1] // puntero de datos DIB); Las siguientes dos líneas permiten a opengl usar el método de filtrado que usa OpenGL al ampliar la textura original (GL_TEXTURE_MAG_FILTER) o reducir la textura original (GL_TEXTURE_MIN_FILTER). // GL_LINEAR usa filtrado lineal para suavizar el procesamiento de imágenes, pero requiere más memoria y CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtrado lineal glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); Lo siguiente es dibujar, usando un cuadrilátero para dibujar una imagen // Habilitar el mapeo de textura si glIsEnabled(GL_TEXTURE_2D) = 0 entonces glEnable(GL_TEXTURE_2D); // Borrar el búfer glClear(GL_COLOR_BUFFER_BIT o GL_DEPTH_BUFFER_BIT l := 10; 10;w:= 200; Ampliar la imagen a 200*200 // Seleccionar textura. Si se utilizan varias texturas en la escena, la textura no se puede vincular entre glBegin() y glEnd() glBindTexture(GL_TEXTURE_2D, glBegin(GL_QUADS); de glTexCoord2f Un parámetro es la coordenada X. // 0.0 es el lado izquierdo de la textura. 0,5 es el punto medio de la textura y 1,0 es el lado derecho de la textura. //El segundo parámetro de glTexCoord2f es la coordenada Y. // 0.0 es la parte inferior de la textura. 0,5 es el punto medio de la textura y 1,0 es la parte superior de la textura. glTexCoord2f(0, 1); glTexCoord2f(1, 0); glTexCoord2f(l + w, t); 0, 0); glVertex2f(l, t + w); glEnd(); Bmp.Libre; SwapBuffers(FDC);fin;
El código completo de este ejemplo se puede descargar aquí.