1. 서문:
델파이의 경우 그림을 그리려면 먼저 처리를 해야 하고, 델파이에 포함되어 있지 않은 다른 유닛을 참조해야 하므로 Gl.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: 테이블 이미지의 높이
형식: 테이블 이미지의 데이터 저장 형식
유형: 알 수 없음
픽셀: DIB 데이터에 대한 포인터
샘플 코드는 다음과 같습니다.
절차 TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // 버퍼 지우기(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT); / TBitmap의 이미지 데이터는 행의 역순으로 메모리에 연속적으로 저장됩니다. 이미지 버퍼 주소인 첫 번째 주소는 TBitmap.ScanLine[TBitmap.Height-1]을 통해 얻을 수 있습니다. // bmp 이미지의 색상은 다음과 같습니다. bgr에 저장되므로 GL_BGR_EXT를 매개변수 glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]); SwapBuffers(FDC);
위의 방법을 사용하여 그림을 그리기 위해 텍스처 매핑을 활성화할 필요는 없습니다. glPixelZoom 기능을 사용하여 그림을 확대/축소할 수 있습니다. 표시 위치는 창의 왼쪽 하단에 있습니다(이미지를 변경하는 방법을 모르겠습니다). 당분간 입장.)
3. 텍스처 그리기 사용
사진의 표시 위치와 확대/축소를 제어하려면 다음 방법을 사용할 수 있습니다.
1. 프로세스에 따라 먼저 이미지를 프로그램에 로드하고 관련 이미지 정보를 얻습니다 .
이미지를 텍스처로 로드하려면 이 사이트를 참조하십시오:://www.VeVB.COm/article/52125.htm
Delphi에서 비트맵을 로드하는 것은 매우 간단하며 다음과 같은 방법으로 로드할 수 있습니다.
(1) 보조 라이브러리의 auxDIBImageLoadA 함수를 통해 이미지를 로드합니다. 반환은 PTAUX_RGBImageRec 데이터 포인터이고 DIB 데이터 형식은 RGB입니다.
// RGB 데이터 구조 TAUX_RGBImageRec = 레코드 크기 .bmp')) // p를 어떻게 풀어주나요? Dispose나 Freemem 모두 이 포인터 끝을 조작할 수 없습니다.
(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') // 작업 수행 // Bmp.Free;end;
2. Gl.pas에서 glGenTextures 및 glBindTexture를 포함하는 텍스처를 생성합니다 .
// 텍스처 영역 생성 glGenTextures(1, @texture); // 텍스처 영역 바인딩 glBindTexture(GL_TEXTURE_2D, text); // 비트맵을 사용하여 이미지 텍스처 생성 glTexImage2D( GL_TEXTURE_2D, // 텍스처는 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. 텍스처 그리기
텍스처를 그리기 전에 텍스처 매핑 glEnable(GL_TEXTURE_2D)을 활성화하도록 OpenGL에 알려야 합니다. 켜져 있으면 텍스처가 아닌 그리기가 작동하지 않습니다. 사용이 끝나면 꼭 닫아주세요.
// 다음은 그림을 그리기 위해 사변형을 사용하는 것입니다. // glIsEnabled(GL_TEXTURE_2D) = 0이면 텍스처 매핑을 활성화하고 glEnable(GL_TEXTURE_2D); // 버퍼를 지웁니다. glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT) l := t := 10; w := 200; 그림을 200*200으로 확대합니다. 장면에 여러 텍스처가 사용되는 경우 glBegin()과 glEnd() 사이에 텍스처를 바인딩할 수 없습니다. glBindTexture(GL_TEXTURE_2D, 텍스처) // 세 번째 glTexCoord2f 중 하나의 매개변수는 X 좌표입니다. // 0.0은 텍스처의 왼쪽입니다. 0.5는 텍스처의 중간점이고 1.0은 텍스처의 오른쪽입니다. //glTexCoord2f의 두 번째 매개변수는 Y 좌표입니다. // 0.0은 텍스처의 맨 아래입니다. 0.5는 텍스처의 중간점이고 1.0은 텍스처의 상단입니다. glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(1, 0); 0, 0); glVertex2f(1, t + w); glEnd();
위 그림이 끝났습니다. 다음은 Draw의 전체 코드입니다. Glaux.pas를 참조할 필요는 없습니다.
절차 TForm1.Draw;var Bmp: TBitmap; 텍스처: GLuint; l, t, w: Integer;begin Bmp := TBitmap.Create(ExtractFilePath(ParamStr(0)) + '1.bmp'); / 텍스처 영역 생성 glGenTextures(1, @texture); // 텍스처 영역 바인딩 glBindTexture(GL_TEXTURE_2D, 텍스처); // 비트맵을 사용하여 이미지 텍스처 생성 glTexImage2D( GL_TEXTURE_2D, // 텍스처는 2D 텍스처입니다. GL_TEXTURE_2D 0, // 이미지의 세부 수준은 기본적으로 0 3, / / 데이터의 구성요소 수. 이미지는 빨간색, 녹색, 파란색으로 구성되므로 기본값은 3Bmp.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); 다음은 그림을 그리기 위해 사변형을 사용하는 것입니다. // glIsEnabled(GL_TEXTURE_2D) = 0이면 텍스처 매핑을 활성화합니다. glEnable(GL_TEXTURE_2D); // 버퍼를 지웁니다. glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT) l := 10; 10; w := 200; 그림을 200*200으로 확대합니다. 장면에 여러 텍스처가 사용되는 경우 glBegin()과 glEnd() 사이에 텍스처를 바인딩할 수 없습니다. glBindTexture(GL_TEXTURE_2D, 텍스처) // 세 번째 glTexCoord2f 중 하나의 매개변수는 X 좌표입니다. // 0.0은 텍스처의 왼쪽입니다. 0.5는 텍스처의 중간점이고 1.0은 텍스처의 오른쪽입니다. //glTexCoord2f의 두 번째 매개변수는 Y 좌표입니다. // 0.0은 텍스처의 맨 아래입니다. 0.5는 텍스처의 중간점이고 1.0은 텍스처의 상단입니다. glTexCoord2f(0, 1); glTexCoord2f(1, 1); glTexCoord2f(1, 0); 0, 0); glVertex2f(1, t + w); glEnd(); SwapBuffers(FDC);끝;
이 예제의 전체 코드는 여기에서 다운로드할 수 있습니다.