BGRABitmap tutorial 9/es

From Lazarus wiki
Revision as of 22:27, 29 April 2011 by Ecch (talk | contribs) (Tutorial 9)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Estas instrucciones muestran como usar phong que protege del sol para hacer texturas.


Contenido

• 1 Cree un nuevo proyecto • 2 Phong proteger del sol y luz • 3 Controle el programa • 4 Use phong que protege del sol para crear texturas • 5 Pasar código • 6 Controle el programa • 7 Utilización Perlin ruido y phong que protege del sol juntos • 8 Controle el programa • 9 Interpretación de agua • 10 Utilización de umbrales para dar copias de nieve

1 Cree un nuevo proyecto

Cree un nuevo proyecto y añada una referencia BGRABitmap, el mismo camino que en las primeras instrucciones.

2 Phong proteger del sol y luz

Para usar el proteger del sol de phong, usted necesita a instanciate una clase TPHONGSHADING. Es localizado en la unidad BGRAGRADIENTS. Vaya a añadir una variable en la definición de forma: TForm1 = clase(TForm) ... phong: TPhongShading; Cuando la forma es creada, podemos crear la clase:

procedimiento TForm1.FormCreate(Remitente: TObject);comenzarphong: = TPhongShading.Crear;

 phong.LightPositionZ : = 150;
 phong.SpecularIndex : = 20;
 phong.AmbientFactor : = 0.4;
 phong.LightSourceIntensity : = 250;
 phong.LightSourceDistanceTerm : = 200;final;

El índice especular indica como se concentró la luz reflejada es. Cuando la forma es destruida: procedimiento TForm1.FormDestroy(Remitente: TObject);comenzarphong.Libre(Gratis);final; Cuando la forma es pintada, añada algún phong el objeto protegido del sol: varimagen: TBGRABitmap;comenzarimagen: = TBGRABitmap.Crear(ClientWidth, ClientHeight, ColorToBGRA(ColorToRGB(clBtnFace)));

 phong.DrawSphere(imagen,rect(20,20,120,120),50, BGRA(255, 0,0));
 imagen.Dibujar(Lona, 0,0,Verdadero);
   imagen.libre(gratis);final;

El parámetro de DrawSphere es la imagen de destino, los límites del objeto, la altitud máxima y el color. El diámetro de la esfera es 100 entonces la altitud máxima de un hemisferio es 50. Finalmente cuando el ratón es movido, sería agradable que la fuente luminosa seguido: procedimiento TForm1.FormMouseMove(Remitente: TObject; Cambio(Movimiento): TShiftState; X, Y: Número entero);comenzarphong.LightPosition : = punto(X, Y);

 FormPaint(Remitente);final;

[revisión] Controle el programa Usted debería ser capaz de jugar con la luz sobre la esfera:

[revisión] Use phong que protege del sol para crear texturas El procedimiento siguiente crea un pedazo de chocolate: función CreateChocolateTexture(tx, ty: número entero): TBGRABitmap;varcuadrado(plaza), mapa: TBGRABitmap;

 phong: TPhongShading;
 margen: número entero;comenzarmargen: = tx división 20; // vaciar el espacio alrededor del cuadrado(de la plaza)cuadrado(plaza): = CreateRectangleMap(tx-2*margin, ty-2*margin, tx división 8); // crear un mapa con el cuadrado(la plaza) en el mediomapa: = TBGRABitmap.Crear(tx, ty, BGRABlack);
 mapa.PutImage(margen, margen, cuadrado(plaza), dmDrawWithTransparency); // aplicar el aspecto borroso para hacerlo más lisoBGRAReplace(mapa, mapa.FilterBlurRadial(tx división 40, rbFast));
 cuadrado(plaza).libre(gratis); // crear el mapa de bits de pasarresultado: = TBGRABitmap.Crear(tx, ty); // usar el proteger del sol de phongphong: = TPhongShading.Crear;
 phong.LightSourceDistanceFactor : = 0;
 phong.LightDestFactor : = 0;
 phong.LightSourceIntensity : = 200;
 phong.AmbientFactor : = 0.5;
 phong.LightPosition : = Punto(-50,-100);
 phong.LightPositionZ : = 80; // dibujar el pedazo de chocolate con la altitud de máximo 20phong.Dibujar(resultado, mapa,20, 0,0, BGRA(86,41,38));
 mapa.Libre(Gratis);
 phong.Libre(Gratis);final;

El phong shader usa un mapa de altitudes para dar los efectos de la luz. Aquí, el mapa contiene un cuadrado(una plaza). Entre las propiedades del phong shader, hay LightSourceDistanceFactor y LightDestFactor. El ajuste de estos valores para poner a cero hace el resultado tilable. De verdad, cuando el factor de distancia es el cero, la distancia entre la luz y el objeto no es tenido en cuenta, y cuando el factor de destino ligero(de luz) es el cero, la posición del objeto no es tenida en cuenta calculando el ángulo de la luz. Ahora, cuando la forma es creada, cree la textura de chocolate:

chocolate: = CreateChocolateTexture(80,80);

Y cuando la forma es destruida:

chocolate.Libre(Gratis);

Antes phong. DrawSphere en el acontecimiento OnPaint, añada esta línea:

imagen.FillRect(0,0,80*7,80*4, chocolate, dmSet);

[revisión] Pasar código unidad UMain;{ $mode objfpc}{ $H +}

interfaz

empleosClases, SysUtils, FileUtil, LResources, Formas, Mandos, Gráfica, Diálogos, ExtCtrls, Botones, BGRABitmap, BGRABitmapTypes, BGRAGradients;tipo

 {TForm1}TForm1 = clase(TForm)Timer1: TTimer; procedimiento FormCreate(Remitente: TObject); procedimiento FormDestroy(Remitente: TObject); procedimiento FormMouseMove(Remitente: TObject; Cambio(Movimiento): TShiftState; X, Y: Número entero); procedimiento FormPaint(Remitente: TObject); privado
   { declaraciones privadas}
 público
   { declaraciones públicas}phong: TPhongShading;
   chocolate: TBGRABitmap; final;varForm1: TForm1;puesta en práctica

función CreateChocolateTexture(tx, ty: número entero): TBGRABitmap;varcuadrado(plaza), mapa: TBGRABitmap;

 phong: TPhongShading;
 margen: número entero;comenzarmargen: = tx división 20;
 cuadrado(plaza): = CreateRectangleMap(tx-2*margin, ty-2*margin, tx división 8);
 mapa: = TBGRABitmap.Crear(tx, ty, BGRABlack);
 mapa.PutImage(margen, margen, cuadrado(plaza), dmDrawWithTransparency);
 BGRAReplace(mapa, mapa.FilterBlurRadial(tx división 40, rbFast));
 cuadrado(plaza).libre(gratis);
 resultado: = TBGRABitmap.Crear(tx, ty);
 phong: = TPhongShading.Crear;
 phong.LightSourceDistanceFactor : = 0;
 phong.LightDestFactor : = 0;
 phong.LightSourceIntensity : = 200;
 phong.AmbientFactor : = 0.5;
 phong.LightPosition : = Punto(-50,-100);
 phong.LightPositionZ : = 80;
 phong.Dibujar(resultado, mapa,20, 0,0, BGRA(86,41,38));
 mapa.Libre(Gratis);
 phong.Libre(Gratis);final;{TForm1}

procedimiento TForm1.FormCreate(Remitente: TObject);comenzarphong: = TPhongShading.Crear;

 phong.LightPositionZ : = 150;
 phong.SpecularIndex : = 20;
 phong.AmbientFactor : = 0.4;
 phong.LightSourceIntensity : = 250;
 phong.LightSourceDistanceTerm : = 200;
 chocolate: = CreateChocolateTexture(80,80);final;procedimiento TForm1.FormDestroy(Remitente: TObject);comenzarphong.Libre(Gratis);
 chocolate.Libre(Gratis);final;procedimiento TForm1.FormMouseMove(Remitente: TObject; Cambio(Movimiento): TShiftState; X, Y: Número entero);comenzarphong.LightPosition : = punto(X, Y);
 FormPaint(Remitente);final;procedimiento TForm1.FormPaint(Remitente: TObject);varimagen: TBGRABitmap;comenzarimagen: = TBGRABitmap.Crear(ClientWidth, ClientHeight, ColorToBGRA(ColorToRGB(clBtnFace)));
 imagen.FillRect(0,0,80*7,80*4, chocolate, dmSet);
   phong.DrawSphere(imagen,rect(20,20,120,120),50, BGRA(255, 0,0));
 imagen.Dibujar(Lona, 0,0,Verdadero);
   imagen.libre(gratis);final;inicialización
 { $I UMain.lrs}

final. [revisión] Controle el programa Usted debería ver una barra agradable de chocolate con una cereza grande:

[revisión] Utilización Perlin ruido y phong que protege del sol juntos La idea es de crear un mapa con un ruido Perlin, y luego usar phong que protege del sol para darlo. Aquí está como crear una textura de piedra:

 función CreateStoneTexture(tx, ty: número entero): TBGRABitmap; vartrabajador interino: TBGRABitmap;
   phong: TPhongShading; comenzarresultado: = CreateCyclicPerlinNoiseMap(tx, ty, 1,1,0.6);
   trabajador interino: = resultado.GetPart(rect(-2,-2, tx+2, ty+2)) como TBGRABitmap;
 phong: = TPhongShading.Crear;
   phong.LightSourceDistanceFactor : = 0;
   phong.LightDestFactor : = 0;
   phong.LightSourceIntensity : = 100;
   phong.LightPositionZ : = 100;
   phong.NegativeDiffusionFactor : = 0.3;
   phong.AmbientFactor : = 0.5;
   phong.Dibujar(resultado, trabajador interino,30,-2,-2, BGRA(170,170,170));
 phong.Libre(Gratis);
   temp.Libre(Gratis); final;

Primero, creamos un mapa cíclico. Es importante que ello ser cíclico para hacer una textura tilable. Pero entonces, cuando aplicaremos el proteger del sol de phong, tenemos que hacer el shader consciente del ciclo. Tan, con GetPart, extraemos el mapa generado con más 2 pixeles por cada frontera, entonces el shader puede ser aplicado al mapa con el ciclo. La llamada a phong. Dibuje con la compensación (-2,-2) da el mapa en la posición(ubicación) correcta, teniendo en cuenta que hemos añadido dos pixeles. Ahora en el acontecimiento OnPaint: procedimiento TForm1.FormPaint(Remitente: TObject);varimagen: TBGRABitmap;

 piedra: TBGRABitmap;comenzarimagen: = TBGRABitmap.Crear(ClientWidth, ClientHeight, ColorToBGRA(ColorToRGB(clBtnFace)));
 piedra: = CreateStoneTexture(100,100);
   imagen.FillEllipseAntialias(200,100,150,50, piedra);
   piedra.libre(gratis);
 imagen.Dibujar(Lona, 0,0,Verdadero);
   imagen.libre(gratis);final;

[revisión] Controle el programa Usted debería ver una forma con un fondo apedreado.

[revisión] Interpretación de agua Esto es casi el mismo procedimiento para generar la textura de agua: función CreateWaterTexture(tx, ty: número entero): TBGRABitmap;const blurSize = 5;vartrabajador interino: TBGRABitmap;

 phong: TPhongShading;comenzarresultado: = CreateCyclicPerlinNoiseMap(tx, ty, 1,1,1.2);
 trabajador interino: = resultado.GetPart(rect(-blurSize,-blurSize, tx+blurSize, ty+blurSize)) como TBGRABitmap;
 BGRAReplace(trabajador interino, temp.FilterBlurRadial(blurSize, rbFast));
 phong: = TPhongShading.Crear;
 phong.LightSourceDistanceFactor : = 0;
 phong.LightDestFactor : = 0;
 phong.LightSourceIntensity : = 150;
 phong.LightPositionZ : = 80;
 phong.LightColor : = BGRA(105,233,240);
 phong.NegativeDiffusionFactor : = 0.3;
 phong.SpecularIndex : = 20;
 phong.AmbientFactor : = 0.4;
 phong.Dibujar(resultado, trabajador interino,20,-blurSize,-blurSize, BGRA(28,139,166));
 phong.Libre(Gratis);
 temp.Libre(Gratis);final;

La diferencia principal es que nosotros aplicamos un filtro de aspecto borroso para hacerlo el agua lisa y poner el color ligero(de luz).

[revisión] Utilización de umbrales para dar copias de nieve Es posible guardar(mantener) sólo una pequeña subgama de altitudes, tener una textura que muestra copias de pie en la nieve. función CreateSnowPrintTexture(tx, ty: número entero): TBGRABitmap;varv: número entero;

 p: PBGRAPixel;
 i: Número entero;
 trabajador interino: TBGRABitmap;
 phong: TPhongShading;comenzar
 // aquí un mapa arbitrario es generadoresultado: = CreateCyclicPerlinNoiseMap(tx, ty, 1,1,1.2); // ahora aplicamos umbralesp: = resultado.Datos; para i: = 0  resultado.NbPixels-1 hacer
 comenzarv: = p ^.rojo; // si el valor es encima de 80 o bajo 50, entonces lo dividimos por 10 para hacerlo casi horizontal
   si v> 80 entonces v: = (v-80) división 10+80; si v < 50 entonces v: = 50-(50-v) división 10;
   p ^.rojo : = v;
   p ^.verde : = v;
   p ^.azul : = v; inc(p); final; // hacer phong shader consciente del ciclotrabajador interino: = resultado.GetPart(rect(-2,-2, tx+2, ty+2)) como TBGRABitmap; // aplicar un aspecto borroso radialBGRAReplace(trabajador interino, temp.FilterBlurRadial(2, rbFast));
 phong: = TPhongShading.Crear;
 phong.LightSourceDistanceFactor : = 0;
 phong.LightDestFactor : = 0;
 phong.LightSourceIntensity : = 100;
 phong.LightPositionZ : = 100;
 phong.NegativeDiffusionFactor : = 0.3; // querer sombrasphong.Dibujar(resultado, trabajador interino,30,-2,-2, BGRAWhite);
 phong.Libre(Gratis);
 temp.Libre(Gratis);final;

Obtenemos esto:

Instrucciones anteriores (texturas) Siguientes instrucciones (trazar un mapa de textura)