{
텍스처는 CPU 시간을 크게 절약할 수 있습니다. 하하, 그런데 이 부분은 시간이 많이 걸렸어요: (
OpenGL 보조 라이브러리를 사용하기 때문에 지금은 이 라이브러리의 기능을 사용하는 사람이 거의 없지만, 그래도 zdcnow(Magnetic Effect) 덕분에 이 보조 라이브러리의 델파이 버전을 제공받았습니다. 이 섹션을 공부하기 전에 glaux.dll 및 Glaux.pas 파일을 온라인으로 다운로드하여 프로젝트에 추가하세요.
좋아, 계속해서 OPENGL 도로를 따라가자.
먼저 SysUtils 유닛을 추가해야 합니다. 이 섹션에서는 파일 작업을 사용할 것이므로 Glaux 유닛도 추가해야 합니다.
그런 다음 첫 번째 강의를 기반으로 xrot, yrot 및 zrot라는 여러 변수를 추가합니다. 이러한 변수는 X, Y 및 Z 축을 중심으로 큐브를 회전하는 데 사용됩니다. Texture[]는 텍스처에 대한 저장 공간을 할당합니다. 두 개 이상의 텍스처가 필요한 경우 숫자 1을 필요한 숫자로 변경해야 합니다.
}
VAR
h_RC: HGLRC; // 렌더링 컨텍스트(쉐이딩 설명 테이블).
h_DC: HDC; // 장치 컨텍스트(장치 설명 테이블)
h_Wnd: HWND; // 창 핸들
h_Instance: HINST; // 프로그램 인스턴스(인스턴스).
키 : Array[0..255] Of Boolean // 키보드 루틴용 배열;
xrot, // X 회전량(신규)
yrot, // Y 회전량(신규)
zrot : GLfloat; // Z 회전량(신규)
Texture : Array[0..1] Of GLuint // 텍스처 저장(신규)
{그런 다음 opengl32.dll에 두 프로세스를 로드하고 이를 사용해야 합니다.}
PROcedure glGenTextures(n: GLsizei; Var 텍스처: GLuint);
OpenGL32;
절차 glBindTexture(대상: GLenum; 텍스처: GLuint);
OpenGL32;
{다음으로 이미지를 다시 입력하기 위한 새 함수를 추가해야 합니다. 이 함수의 반환 유형은 다음과 같이 Gaux.pas에 정의되어 있습니다.
TAUX_RGBImageRec= 기록
sizeX, sizeY: GLint;
데이터: 포인터;
끝;
PTAUX_RGBImageRec= ^TAUX_RGBImageRec;
구체적인 의미는 나중에 소개하겠습니다.}
함수 LoadBmp(파일명: pchar): PTAUX_RGBImageRec;
바르
BitmapFile : // 파일 핸들;
시작하다
//다음으로 파일 이름이 제공되었는지 확인합니다.
If Filename = '' Then // 파일 이름이 제공되었는지 확인합니다.
result := Nil; // 제공되지 않은 경우 NULL을 반환합니다.
//그런 다음 파일이 존재하는지 확인합니다.
BitmapFile := FileOpen(Filename, fmOpenWrite) //파일 열기를 시도합니다.
//파일을 열 수 있다면 분명히 파일이 존재하는 것입니다.
If BitmapFile > 0 Then // 파일이 존재합니까?
시작하다
//파일을 닫습니다.
FileClose(BitmapFile) //핸들 닫기
//auxDIBImageLoad(Filename)은 이미지 데이터를 읽어서 반환합니다.
result := auxDIBImageLoadA(filename); //비트맵을 로드하고 포인터를 반환합니다.
끝
또 다른
//파일을 열 수 없으면 NiL을 반환합니다.
result := Nil; // 로딩에 실패하면 NiL을 반환합니다.
끝;
//다음으로 텍스처 맵을 로드하는 새 함수를 만듭니다.
함수 LoadTexture: 부울;
//상태변수. 이를 사용하여 비트맵을 로드할 수 있는지, 텍스처를 생성할 수 있는지 추적합니다.
// 상태는 기본적으로 FALSE로 설정됩니다(아무것도 로드되거나 생성되지 않음을 나타냄).
//TextureImage 변수 PTAUX_RGBImageRec 유형은 비트맵의 이미지 기록을 저장합니다.
//이 레코드에는 비트맵의 너비, 높이 및 데이터가 포함됩니다.
바르
상태: 부울;
TextureImage : PTAUX_RGBImageRec의 배열[0..1];
시작하다
상태 := 거짓;
ZeroMemory(@TextureImage, sizeof(TextureImage)); // 포인터를 NULL로 설정합니다.
TextureImage[0] := LoadBMP('Texture.bmp');
TextureImage[0] <> Nil이면
시작하다
상태 := TRUE; // 상태를 TRUE로 설정합니다.
//이제 TextureImage[0]의 데이터를 사용하여 텍스처를 만듭니다.
//glGenTextures(1, text[0])은 OpenGL에게 텍스처 이름을 생성하고 싶다고 알립니다.
//(여러 개의 텍스처를 로드하려면 개수를 늘립니다.)
//glBindTexture(GL_TEXTURE_2D, text[0])는 OpenGL에게 텍스처 이름 text[0]을 텍스처 대상에 바인딩하도록 지시합니다.
//2D 텍스처에는 높이(Y축)와 너비(X축)만 있습니다.
//메인 함수는 텍스처 이름을 텍스처 데이터에 할당합니다.
//이 예에서는 OpenGL에게 &texture[0]의 메모리를 사용할 수 있음을 알립니다.
//우리가 생성한 텍스처는 &texture[0]이 가리키는 메모리 영역에 저장됩니다.
glGenTextures(1, 텍스처[0]); // 텍스처 생성
glBindTexture(GL_TEXTURE_2D, text[0]); //비트맵 데이터에서 생성된 일반적인 텍스처 사용
//아래로 실제 텍스처를 생성합니다.
//다음 줄은 OpenGL에게 이 텍스처가 2D 텍스처(GL_TEXTURE_2D)임을 알려줍니다.
//숫자 0은 이미지의 세부 수준을 나타내며 일반적으로 0으로 유지됩니다.
//숫자 3은 데이터의 구성 요소 수입니다. 이미지는 빨간색 데이터, 녹색 데이터, 파란색 데이터의 세 가지 구성 요소로 구성되어 있기 때문입니다.
//TextureImage[0].sizeX는 텍스처의 너비입니다.
//너비를 알고 있으면 여기에 입력할 수 있지만 컴퓨터가 이를 쉽게 알아낼 수 있습니다.
// TextureImage[0].sizey는 텍스처의 높이입니다.
//숫자 0은 테두리 값이며 일반적으로 0입니다.
// GL_RGB는 OpenGL에게 이미지 데이터가 빨간색, 녹색, 파란색 데이터로 구성되어 있음을 알려줍니다.
//GL_UNSIGNED_BYTE는 이미지를 구성하는 데이터가 부호 없는 바이트 유형임을 의미합니다.
//마지막으로... TextureImage[0].data는 OpenGL에게 텍스처 데이터의 소스를 알려줍니다.
//이 예제는 TextureImage[0] 레코드에 저장된 데이터를 가리킵니다.
// 텍스처 생성
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
텍스처이미지[0].sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
텍스처이미지[0].data);
//다음 두 줄은 이미지를 표시할 때 OpenGL에 알려줍니다.
//확대된 원본 텍스처보다 큰 경우 (GL_TEXTURE_MAG_FILTER)
// 또는 텍스처가 원래 텍스처(GL_TEXTURE_MIN_FILTER)보다 작은 크기로 축소될 때 OpenGL에서 사용하는 필터링 방법입니다.
//보통 두 경우 모두 GL_LINEAR을 사용합니다. 이를 통해 텍스처가 화면에 먼 곳부터 매우 가까운 곳까지 원활하게 나타날 수 있습니다.
//GL_LINEAR를 사용하려면 CPU와 그래픽 카드가 더 많은 작업을 수행해야 합니다.
//컴퓨터가 느리다면 아마도 GL_NEAREST를 사용해야 할 것입니다.
//필터링된 텍스처를 확대하면 매우 모자이크(mosaic)처럼 보입니다.
//이 두 가지 필터링 방법을 결합할 수도 있습니다. 가까이 있을 때는 GL_LINEAR를 사용하고 멀리 있을 때는 GL_NEAREST를 사용하세요.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) // 선형 필터링
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) // 선형 필터링
끝;
//이제 이전에 비트맵 데이터를 저장하는 데 사용된 메모리를 해제합니다.
//먼저 비트맵 데이터가 저장되어 있는지 확인합니다.
//그렇다면 데이터가 저장되었는지 확인한다.
//저장되어 있으면 삭제한다.
//그런 다음 TextureImage[0] 이미지 구조를 해제하여 모든 메모리가 해제될 수 있도록 합니다.
If Assigned(TextureImage[0]) Then // 텍스처가 존재하는지 여부
If Assigned(TextureImage[0].data) Then // 텍스처 이미지가 존재하는지 여부
TextureImage[0].data := Nil; // 텍스처 이미지가 차지하는 메모리를 해제합니다.
TextureImage[0] := Nil; // 이미지 구조 해제
//마지막으로 상태 변수를 반환합니다. 모든 것이 정상이면 Status 변수의 값은 TRUE입니다. 그렇지 않으면 거짓
결과 := 상태; // 상태 반환
끝;