Delphi에서 OpenGL2d로 그림을 그리는 Bmp 방법

6529 단어
1. 앞말:
델피의 경우 그림을 그리려면 먼저 처리를 해야 하고 다른 단원을 인용해야 하며 델피의 경우 글로를 따로 다운로드해야 한다.pas.인터넷에서 흔히 볼 수 있는 OpenGl 단원은 1.0 버전으로 봉인되어 있으며, 이 함수는 성명되지 않았다.인터넷에서 Gl을 찾을 수 있습니다.pas 단원.Glaux가 하나 더 필요합니다.pas 단원과glaux.dll, 보조 라이브러리입니다.본문은 마지막으로 다운로드를 제공할 것이다.
2. 실현 절차:
그림을 그리려면 다음과 같은 몇 가지 절차가 필요하다.윈도 자체의 그림은 비트맵을 바탕으로 하는 png,jpg 등으로 그림을 그릴 때 bmp로 바꾸어 그릴 수 있다.
1. bmp 이미지 로드: auxDIBImageLoadA 또는 기타 함수 사용
2. 텍스처로 변환:glGenTextures -> glBindTexture-> glTexImage2D,glTexParameteri는 관련 매개 변수를 설정하는 데 사용
3. 텍스처 그리기:glBindTexture-> glBegin(GL QUADS)-> glTexCoord2f -> glVertex2f -> glEnd
3. glDrawPixels 함수를 이용하여 그림 그리기
glDrawPixels에는 총 5개의 매개변수가 있습니다.
width: 테이블 이미지의 너비height: 테이블 이미지의 높이format: 테이블 이미지의 데이터 저장 형식atype: 알 수 없는 pixels: DIB 데이터의 바늘
예제 코드는 다음과 같습니다.

procedure TForm1.Draw;
var
 Bmp: TBitmap;
begin
 Bmp := TBitmap.Create;
 Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp');
 //      
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 // TBitmap                   ,  TBitmap.ScanLine[TBitmap.Height-1]               
 // bmp       b g r   ,     GL_BGR_EXT    
 glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]);
 SwapBuffers(FDC);
 Bmp.Free;
end;


위의 방법으로 그림을 그릴 때 무늬 맵을 사용하지 않아도 되고glPixelZoom 함수를 통해 그림을 축소할 수 있으며, 창의 왼쪽 아래에 표시됩니다. (그림 위치를 바꾸는 방법을 잠시 알 수 없습니다.)
3. 텍스쳐 드로잉 사용
그림의 표시 위치와 확대에 따라 축소하려면 다음과 같은 방법을 사용할 수 있다.
1. 절차에 따라 우리는 먼저 그림을 프로그램에 불러와 관련 그림 정보를 얻는다.
그림을 무늬에 불러오면 본 사이트를 참조할 수 있습니다://www.jb51.net/article/52125.htm
델파이에서 비트맵을 로드하는 것은 간단합니다. 다음과 같은 방법으로 로드할 수 있습니다.
(1) 보조 라이브러리의 auxDIBImageLoadA 함수를 통해 그림을 불러오고 PTAUX 로 되돌아옵니다RGBImageRec 데이터 포인터, DIB 데이터 형식은 RGB입니다.

 // RGB      
 TAUX_RGBImageRec = record
  sizeX, sizeY: GLint;
  data: pointer;
 end;
 PTAUX_RGBImageRec = ^TAUX_RGBImageRec;
var
 p: PTAUX_RGBImageRec;
begin
 p := auxDIBImageLoadA(PAnsiChar(ExtractFilePath(ParamStr(0)) + '1.bmp'));
 // p     ? Dispose Freemem         
end;

(2) TBitmap을 통해LoadFromFile에서 그림을 로드합니다.Delphi는 자체로 효율적으로 auxDIBImageLoadA와 성능이 같지만 DIB 데이터 형식은 BGR이고 DIB 바늘은 TBitmap이다.ScanLine[Bmp.Height - 1]

var
 Bmp: TBitmap;
begin
 Bmp := TBitmap.Create;
 TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp');
 // do something
 //     
 Bmp.Free;
end;


2. 무늬를 만든다. 그 중에서glGenTextures와glBindTexture는 Gl에 있다.패스 중.

 //       
 glGenTextures(1, @texture);
 //       
 glBindTexture(GL_TEXTURE_2D, texture);
 //           
 glTexImage2D(
  GL_TEXTURE_2D,      //      2D   GL_TEXTURE_2D
  0,            //            0
  3,            //       。       , ,        3
  Bmp.Width,        //      
  Bmp.Height,        //      
  0,            //         0
  GL_BGR_EXT,        //      bmp   bgr
  GL_UNSIGNED_BYTE,     //                 
  Bmp.ScanLine[Bmp.Height - 1] // DIB    
 );
 //       opengl         (GL_TEXTURE_MAG_FILTER)       (GL_TEXTURE_MIN_FILTER) OpenGL       。
 // GL_LINEAR       ,          ,         CPU
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //     
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //     


3. 텍스쳐 그리기
텍스쳐를 그리기 전에 OpenGL에 텍스쳐 매핑 glEnable(GL TEXTURE 2D)이 켜져 있음을 알려야 합니다.비텍스쳐 드로잉은 켜져 있으면 작동하지 않습니다.쓰고 닫으면 돼.

 //      ,       ,    
 //       
 if glIsEnabled(GL_TEXTURE_2D) = 0 then
  glEnable(GL_TEXTURE_2D);
 //      
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
 l := 10;
 t := 10;
 w := 200; //    200*200   
 //                 ,   glBegin()   glEnd()       
 glBindTexture(GL_TEXTURE_2D, texture);
 glBegin(GL_QUADS);
 // glTexCoord2f        X  。
 // 0.0      。 0.5      , 1.0      。
 // glTexCoord2f        Y  。
 // 0.0      。 0.5      , 1.0      。
 glTexCoord2f(0, 1);
 glVertex2f(l, t);
 glTexCoord2f(1, 1);
 glVertex2f(l + w, t);
 glTexCoord2f(1, 0);
 glVertex2f(l + w, t + w);
 glTexCoord2f(0, 0);
 glVertex2f(l, t + w);
 glEnd();


위의 그림이 끝났습니다. 다음은 Draw의 완전한 코드입니다. 보조 라이브러리 Glaux를 인용하지 않아도 됩니다.pas

procedure TForm1.Draw;
var
 Bmp: TBitmap;
 texture: GLuint;
 l, t, w: Integer;
begin
 Bmp := TBitmap.Create;
 Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp');
 //       
 glGenTextures(1, @texture);
 //       
 glBindTexture(GL_TEXTURE_2D, texture);
 //           
 glTexImage2D(
  GL_TEXTURE_2D,      //      2D   GL_TEXTURE_2D
  0,            //            0
  3,            //       。       , ,        3
  Bmp.Width,        //      
  Bmp.Height,        //      
  0,            //         0
  GL_BGR_EXT,        //      bmp   bgr
  GL_UNSIGNED_BYTE,     //                 
  Bmp.ScanLine[Bmp.Height - 1] // DIB    
 );
 //       opengl         (GL_TEXTURE_MAG_FILTER)       (GL_TEXTURE_MIN_FILTER) OpenGL       。
 // GL_LINEAR       ,          ,         CPU
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //     
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //     
 //      ,       ,    
 //       
 if glIsEnabled(GL_TEXTURE_2D) = 0 then
  glEnable(GL_TEXTURE_2D);
 //      
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
 l := 10;
 t := 10;
 w := 200; //    200*200   
 //                 ,   glBegin()   glEnd()       
 glBindTexture(GL_TEXTURE_2D, texture);
 glBegin(GL_QUADS);
 // glTexCoord2f        X  。
 // 0.0      。 0.5      , 1.0      。
 // glTexCoord2f        Y  。
 // 0.0      。 0.5      , 1.0      。
 glTexCoord2f(0, 1);
 glVertex2f(l, t);
 glTexCoord2f(1, 1);
 glVertex2f(l + w, t);
 glTexCoord2f(1, 0);
 glVertex2f(l + w, t + w);
 glTexCoord2f(0, 0);
 glVertex2f(l, t + w);
 glEnd();
 Bmp.Free;
 SwapBuffers(FDC);
end;


이 실례의 전체 코드는 이것을 누르면 다운로드할 수 있습니다.

좋은 웹페이지 즐겨찾기