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

6908 단어 DelphiOpenGL2d
1.머리말:
Delphi 에 게 그림 을 그 리 려 면 먼저 처리 해 야 합 니 다.다른 단원 을 참조 해 야 합 니 다.Delphi 에 없 으 면 Gl.pas 를 따로 다운로드 해 야 합 니 다.인터넷 에서 흔히 볼 수 있 는 OpenGl 유닛 은 1.0 버 전 으로 봉 인 된 것 으로 이 함수 가 설명 되 지 않 았 습 니 다.인터넷 에서 Gl.pas 단원 을 찾 을 수 있 습 니 다.또한 Glaux.pas 유닛 과 glux.dll 이 필요 합 니 다.보조 라 이브 러 리 입 니 다.본문 마지막 에 다운 로드 를 제공 할 것 이다.
2.실현 절차:
그림 을 그 리 는 데 는 다음 과 같은 몇 가지 절차 가 필요 하 다.Window 자체 의 그림 은 비트 맵 을 바탕 으로 하 는 png,jpg 등 으로 그림 을 그 릴 때 bmp 로 바 꾸 어 그 릴 수 있 습 니 다.
1.bmp 그림 불 러 오기:auxDIBImageLoadA 또는 기타 함수 사용 하기
2.텍 스 처 로 변환:glGenTextures->glBindTexture->glTexImage2D,glTexParameteri 는 관련 매개 변 수 를 설정 하 는 데 사 용 됩 니 다.
3.텍 스 처 그리 기:glBindTexture->glBegin(GLQUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3.glDrawPixels 함수 로 그림 그리 기
glDraw Pixels 에는 다음 과 같은 5 개의 인자 가 있 습 니 다.
width:표 그림 의 너비
height:표 그림 의 높이
format:표 이미지 의 데이터 저장 형식
유형:알 수 없 음
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.절차 에 따라 우 리 는 먼저 그림 을 프로그램 에 불 러 와 관련 된 그림 정 보 를 얻 습 니 다.
그림 을 텍 스 처 에 불 러 오 면 본 사이트 참조:https://www.jb51.net/article/52125.htm
delphi 에 비트 맵 을 불 러 오 는 것 은 간단 합 니 다.다음 과 같은 방식 으로 불 러 올 수 있 습 니 다.
(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 자체 테이프,효율 적 으로 비교 하면 aux DIBImage LoadA 와 성능 은 같 지만 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.pas 에 있 습 니 다.

 //       
 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(GLTEXTURE_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;

이 인 스 턴 스 의 전체 코드 는 이것 을 누 를 수 있 습 니 다다운로드 하 다.

좋은 웹페이지 즐겨찾기