Delphi OpenGL2d 로 그림 을 그 리 는 방법 Bmp
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;
이 인 스 턴 스 의 전체 코드 는 이것 을 누 를 수 있 습 니 다다운로드 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.