Delphi에서 OpenGL2d로 그림을 그리는 Bmp 방법
델피의 경우 그림을 그리려면 먼저 처리를 해야 하고 다른 단원을 인용해야 하며 델피의 경우 글로를 따로 다운로드해야 한다.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;
이 실례의 전체 코드는 이것을 누르면 다운로드할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.