OPENGL 그래픽 프로그래밍
OPENGL은 3차원 그래픽 및 모델 라이브러리로, 3차원 그래픽의 탁월한 성능으로 인해 현재 VC, DELPHI, C++Builder 등과 같은 많은 고급 언어에서 OPENGL과의 인터페이스를 제공합니다. OPENGL을 사용하면 사용자의 그래픽 및 이미지 개발 난이도가 크게 줄어들어 사용자는 높은 수준의 상업 광고, 그래픽 CAD, 3차원 애니메이션, 그래픽 시뮬레이션, 영화 및 TV 컬렉션을 제작할 수 있습니다.
1. OPENGL의 기능
OPENGL은 원래 워크스테이션의 그래픽 소프트웨어 라이브러리로, 상업, 군사, 의료, 항공우주 및 기타 분야에 광범위하게 적용되므로 이제 사용자 요구 사항을 충족하는 그래픽을 저가형 컴퓨터에서 개발할 수 있습니다. OPENGL은 기본 이미지를 그릴 수 있을 뿐만 아니라 그래픽 이미지 처리를 위한 다양한 기능과 절차를 제공합니다.
1. 그래픽 변환
이는 그래픽 디스플레이 및 제작의 기본입니다. 애니메이션 디자인과 애니메이션 디스플레이는 그래픽 변환과 분리될 수 없습니다. 그래픽 변환은 일반적으로 직사각형의 곱셈을 통해 구현됩니다. 그래픽의 표시 속성에 따라: 시점 변환, 모델 변환, 투영 변환, 클리핑 변환 및 뷰포트 변환 등
2. 조명 효과
비발광 물체의 색상은 물체가 외부 빛, 즉 조명을 반사하여 발생합니다. 3차원 그래픽에서 조명을 부적절하게 사용하면 3차원 그래픽은 진정한 3차원 감각을 잃게 됩니다. OPENGL은 조명을 방사광, 주변광, 산란광, 반사광 등으로 구분합니다.
3. 텍스처 매핑
텍스처 매핑을 사용하면 실제 텍스처를 3차원 표면에 추가할 수 있습니다. 예를 들어, 직사각형은 현실 세계의 객체를 표현할 수 없습니다. "필수적인" 질감으로 채워지면 현실적이 됩니다.
4. 그래픽 특수 효과
블렌딩 기능, 앤티앨리어싱 기능 및 안개 기능은 3차원 그래픽의 투명도와 반투명도를 처리하고 개체를 매끄럽게 하며 선분을 사용하여 매끄럽게 하고 안개 효과를 제공할 수 있습니다.
5. 이미지 특수 효과
비트맵 처리를 위한 기본 기능: 이미지 그리기, 이미지 복사 및 저장, 매핑 및 전송, 이미지 크기 조정 등 비트맵 연산 기능은 원화의 하위레벨에서 한자의 형성과정을 설명할 수 있다.
2. OPENGL 애플리케이션 생성
1. 일반 원칙
A. 사용 중인 OPENGL 지원 유닛 추가: OpenGL;
B 양식의 OnCreate 이벤트 중에 OPENGL을 초기화합니다.
C는 창의 OnPaing 이벤트 중에 OPENGL을 초기화합니다.
D는 창의 OnResize 이벤트 중에 OPENGL을 초기화합니다.
E는 창의 OnDestroy 이벤트 중에 OPENGL을 초기화합니다.
2. 간단한 예
A 프로젝트 생성 FILE->새 애플리케이션
B OnCreate 이벤트에 코드를 추가합니다.
PROcedure TfrmMain.FormCreate(Sender: TObject);
var
pfd:TPixelFormatDescriptor; //설명 테이블 설정
PixelFormat:정수;
시작하다
컨트롤스타일:=컨트롤스타일+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
pfd와 함께
시작하다
nSize:=sizeof(TPixelFormatDescriptor);
n버전:=1;
dwFlags:=PFD_DRAW_TO_WINDOW 또는
PFD_SUPPORT_OPENGL 또는 PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
끝;
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=클라이언트 너비;
h:=클라이언트 높이;
끝;
OnDestroy 이벤트의 C 코드
절차 TfrmMain.FormDestroy(Sender: TObject);
시작하다
wglDeleteContext(hrc);
끝;
OnPaint 이벤트의 D 코드
절차 TfrmMain.FormPaint(Sender: TObject);
시작하다
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
마이드로;
glFlush;
SwapBuffers(Canvas.Handle);
끝;
OnResize 이벤트의 E 코드
절차 TfrmMain.FormResize(Sender: TObject);
시작하다
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,ClientWidth,ClientHeight);
마이드로;
끝;
MyDraw 함수의 F 코드(창 클래스에서 사용자가 선언)
절차 TfrmMain.MyDraw;
시작하다
glPushMatrix;
구:=gluNewQuadric;
gluQuadricDrawStyle(구체,GLU_LINE);
gluSphere(구,0.5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(구형);
끝;
첨부된 내용은 이 프로그램의 원본 코드입니다.
단위 MainFrm;
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화상자, OpenGL;
유형
TfrmMain = 클래스(TForm)
절차 FormCreate(보내는 사람: TObject);
절차 FormDestroy(보내는 사람: TObject);
절차 FormPaint(보내는 사람: TObject);
절차 FormResize(Sender: TObject);
사적인
{비공개 선언}
hrc:HGLRC;
w,h:glFloat;
구:GLUquadricObj;
공공의
{공개 선언}
절차 MyDraw;
끝;
var
frmMain: TfrmMain;
구현
{$R *.dfm}
절차 TfrmMain.FormCreate(Sender: TObject);
var
pfd:TPixelFormatDescriptor;
PixelFormat:정수;
시작하다
컨트롤스타일:=컨트롤스타일+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
pfd와 함께
시작하다
nSize:=sizeof(TPixelFormatDescriptor);
n버전:=1;
dwFlags:=PFD_DRAW_TO_WINDOW 또는
PFD_SUPPORT_OPENGL 또는 PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
끝;
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=클라이언트 너비;
h:=클라이언트 높이;
끝;
절차 TfrmMain.FormDestroy(Sender: TObject);
시작하다
wglDeleteContext(hrc);
끝;
절차 TfrmMain.FormPaint(Sender: TObject);
시작하다
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
마이드로;
glFlush;
SwapBuffers(Canvas.Handle);
끝;
절차 TfrmMain.MyDraw;
시작하다
glPushMatrix;
구:=gluNewQuadric;
gluQuadricDrawStyle(구체,GLU_LINE);
gluSphere(구,0.5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(구형);
끝;
절차 TfrmMain.FormResize(Sender: TObject);
시작하다
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,ClientWidth,ClientHeight);
마이드로;
끝;
끝.
3. OPENGL 변수 및 함수에 대한 규칙
1. OPENGL 라이브러리 규칙
기본 라이브러리, 실습 라이브러리, 보조 라이브러리 등 총 3개의 라이브러리가 있습니다. DELPHI에서는 기본 라이브러리가 OpenGL 단위로 구현되어 있으며, Windows 환경에서는 일반적으로 보조 라이브러리를 사용하지 않습니다.
2. OPENGL 상수 규칙
OPENGL 상수는 "GL"로 시작하는 대문자를 사용하고 밑줄을 사용하여 다음과 같이 단어를 구분합니다. GL_LINES는 기본 라이브러리를 사용하여 직선을 그리는 것을 의미합니다.
3. OPENGL 함수의 명명 규칙
A 첫 번째 부분은 glColor3f의 gl처럼 gl 또는 wgl로 시작합니다.
B 두 번째 부분은 영어로 표현한 함수로, 단어의 첫 글자를 대문자로 표기한다.
C의 세 번째 부분은 함수의 매개변수를 나타내는 숫자입니다.
D의 네 번째 부분은 함수 유형을 나타내는 소문자입니다.
b9비트 정수
s16비트 정수
i32비트 정수
f32비트 부동 소수점 수
d64비트 부동 소수점 수
ub9비트 부호 없는 정수
예: glVertex2f(37,40); {두 개의 32비트 부동 소수점 숫자를 매개변수로 사용}
glVertex3d(37,40,5); {3개의 64비트 부동 소수점 숫자를 매개변수로 사용}
p[1..3]:glFloat 배열;
glVertes3fv(p); {3f는 세 개의 부동 소수점 숫자를 나타내고, v는 정점 좌표 입력으로 배열을 호출하는 것을 나타냅니다.}
4. OPENGL 초기화
1. PIXELFORMATDESCRIPTOR 구조
주로 픽셀의 색상 모드, 빨간색, 녹색, 파란색의 구성과 같은 픽셀의 속성을 설명합니다.
tagPIXELFORMATDESCRIPTOR = 압축된 레코드
n크기: 워드;
n버전: 워드;
dwFlags: DWORD;
iPixelType: 바이트;
cColorBits: 바이트;
cRedBits: 바이트;
cRedShift: 바이트;
cGreenBits: 바이트;
cGreenShift: 바이트;
cBlueBits: 바이트;
cBlueShift: 바이트;
cAlphaBits: 바이트;
cAlphaShift: 바이트;
cAccumBits: 바이트;
cAccumRedBits: 바이트;
cAccumGreenBits: 바이트;
cAccumBlueBits: 바이트;
cAccumAlphaBits: 바이트;
cDepthBits: 바이트;
cStencilBits: 바이트;
cAuxBuffers: 바이트;
iLayerType: 바이트;
b예약됨: 바이트;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
끝;
TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR;
dwFlags는 포인트 형식의 속성을 나타냅니다.
PFD_DRAW_TO_WINDOW 그래픽이 화면이나 장치 표면에 그려집니다.
PFD_DRAW_TO_BITMAP은 메모리에 비트맵을 그립니다.
PFD_SUPPORT_GDI는 GDI 드로잉을 지원합니다.
PFD_SUPPORT_OPENGL은 OPENGL 기능을 지원합니다.
PFD_DOUBLEBUFFER는 이중 버퍼링을 사용합니다.
PFD_STEREO 스테레오 캐시
PFD_NEED_PALLETTE는 RGBA 팔레트를 사용합니다.
PFD_GENERIC_FORMAT은 GDI에서 지원하는 형식 도면을 선택합니다.
PFD_NEED_SYSTEM_PALETTE는 OPENGL 지원 하드웨어 팔레트를 사용합니다.
iPixelType은 픽셀 색상 모드를 PFD_TYPE_RGBA 또는 PFD_TYPE_INDEX로 설정합니다.
cColorBits는 색상 비트를 설정합니다. 9이면 점의 색상을 나타내는 색상이 256개라는 의미입니다.
cRedBits, cGreenBits, cBlueBits RGBA를 사용할 때 세 가지 기본 색상에 사용되는 비트 수입니다.
cRedShitfs, cGreenShifts, cBlueShifts RGBA를 사용할 때 세 가지 기본 색상에 대해 조정할 수 있는 자릿수입니다.
cAlphaBits, cAlphaShifts RGBA를 사용할 때 Alpha에서 사용하는 비트 수와 조정 가능한 비트 수입니다.
cAccumBits는 누적 버퍼 영역의 총 비트 수를 설정합니다.
cAccumRedBits, cAccumGreenBits 및 cAccumBlueBits는 누적 버퍼 영역에서 세 가지 기본 색상 평면의 총 수를 설정합니다.
cAccumAlphaBits는 누적 버퍼의 총 Alpha 비트 수를 설정합니다.
cDepthBits는 농도 버퍼의 깊이를 설정합니다.
cStencilBits는 스텐실 캐시의 깊이를 설정합니다.
cAuxBuffers는 보조 버퍼의 크기를 나타냅니다.
iLayerType은 레이어 유형을 지정합니다.
bReserved는 사용되지 않으며 0이어야 합니다.
dwLayerMask는 오버레이의 마스크를 지정합니다.
dwDamageMask는 동일한 픽셀 모드가 동일한 프레임 캐시에서 공유되는지 여부를 설정합니다.
2. OPENGL의 초기화 단계
A Canvas.Handle을 사용하여 창 핸들을 얻습니다.
B TPixelFormatDescriptor 변수를 생성하여 픽셀 형식을 정의합니다.
C ChoosePixelFormat 함수를 사용하여 픽셀 형식을 선택합니다.
D SetPixelFormat 함수를 사용하여 픽셀 형식을 적용합니다.
E wglCreateContext 함수를 사용하여 번역 설명 테이블을 생성합니다.
F 생성된 번역 설명 테이블을 현재 번역 설명 테이블로 사용하려면 wglMakeCurrent 함수를 사용합니다.
3. 자원 공개
A wglDeleteContext 프로시저를 사용하여 픽셀 컨텍스트 테이블을 삭제합니다.
B 창 메모리를 해제하려면 ReleaseDC 프로시저를 사용합니다.
창의 OnDestroy 이벤트에서:
시작하다
hrc<>null이면
wglDeleteCurrent(hrc);
hdc<>null이면
ReleaseDC(핸들,hdc);
끝;
5. OPENGL 기본 그래픽 그리기
1. 그래픽 색상
배경색 설정에 주의하세요. 색상 설정은 일반적으로 픽셀 설명 변수, 즉 TPixelFormatDescriptor 정의의 iPixelType 멤버와 관련됩니다.
iPixelType:=PFD_TYPE_COLORINDEX;
그런 다음 glIndexd, glIndexf, glIndexi, glIndexs, glIndexv, glIndexfv, glIndexiv, glIndexsv 프로시저만 사용하여 그래픽 색상을 설정할 수 있습니다.
iPixelType:=PFD_TYPE_RGBA;
그러면 glColor3b, glColor3f, glColor4b, glColor4f, glColor4fv만 사용하여 그래픽 색상을 설정할 수 있습니다.
그래픽 배경색: 화면과 창의 색상, 즉 색상 버퍼의 색상입니다. 그래픽의 배경색을 변경하려면 먼저 glClearColor 프로시저를 사용하여 배경색을 설정한 다음 glClear 프로시저를 사용하여 이 배경색으로 창과 화면을 새로 고쳐야 합니다.
절차 glClearColor(빨간색:GLClampf, 녹색:GLClampf, 파란색:GLClampf, 알파:GLClampf);
절차 glClear(마스크:GLBitField);
빨강, 초록, 파랑, 알파는 설정할 배경색이며, 그 값은 0~1이다. 마스크는 배경색을 새로 고치는 방법입니다.
예: 컬러링 창을 녹색으로 설정
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
마스크의 가치와 의미:
GL_COLOR_BUFFER_BIT는 현재 색상 버퍼를 설정합니다.
GL_DEPTH_BUFFER_BIT는 현재 깊이 버퍼를 설정합니다.
GL_ACCUM_BUFFER_BIT는 현재 누적 버퍼를 설정합니다.
GL_STENCIL_BUFFER_BIT는 현재 STENCIL(템플릿) 버퍼를 설정합니다.
도면 창이 회색으로 설정되었습니다.
glClearColor(0.3,0.3,0.3,1);
glClear(GL_COLOR_BUFFER_BIT);
B 그래픽 컬러
glClear3f 및 glClear4f를 사용하여 그래픽 그리기 색상을 설정합니다. 3개의 매개변수를 사용한다는 것은 각각 빨간색, 파란색, 녹색 빛의 세 가지 색상을 설정한다는 의미입니다. 4개의 매개변수가 사용되는 경우 네 번째 매개변수는 RGBA 값을 나타냅니다.
현재 그리기 색상을 파란색으로 설정하는 예:
glColor3f(0,0,1);
플롯 색상을 흰색으로 설정합니다.
glColor3f(1,1,1);
2. 간단한 그래픽 그리기
glBegin과 glEnd 프로시저 사이에 점, 선, 다각형 등과 같은 간단한 그래픽을 그립니다.
glBegin(mode:GLenum);{그리기 과정}glEnd;
모드 값:
GL_POINTS는 여러 점을 그립니다.
GL_LINES는 두 점마다 직선을 그리면서 여러 선을 그립니다.
GL_LINE_STRIP은 폴리라인을 그립니다.
GL_LINE_LOOP는 끝에서 끝까지 연결된 닫힌 다각형을 그립니다.
GL_TRIANGLES는 삼각형을 그립니다.
GL_TRIANGLE_STRIP은 세 점마다 삼각형을 그리는 삼각형을 그립니다.
GL_TRIANGLE_FAN은 삼각형을 그립니다.
GL_QUADS는 사각형을 그립니다.
GL_QUAD_STRIP은 사각형 스트립을 그립니다. 4개 점마다 하나의 사각형 스트립이 그려집니다.
GL_POLYGON은 다각형을 그립니다.
세 점을 그리는 예:
시작하다
glPushMatrix;
glBegin(GL_POINT);
glVertex2f(0.1,0.1);
glVertex2f(0.5,0.5);
glVertex2f(0.1,0.3);
glEnd;
SwapBuffers(Canvas.Handle);
끝;
GL_POINT를 GL_LINES로 변경하면 세 번째 점은 유효하지 않습니다. glVertex2f 전에 glColor3f(0,0,1)을 수행하면 선의 색상이 녹색으로 변경됩니다. 두 개의 직선.
glPointSize 프로시저를 사용하여 포인트 크기를 설정하고, glLineWidth 프로시저를 사용하여 선 너비를 설정합니다.
glLineStipple 프로시저를 사용하여 점선에 대한 템플릿을 설정하고 glEnable(GL_LINE_STIPPLE) 프로시저와 해당 매개변수를 사용하여 점선을 그릴 수 있는 그리기를 활성화합니다. glDisable(GL_LINE_STIPPLE) 프로시저와 해당 매개변수는 점선을 끕니다.
절차 glLineStipple(factor:GLint,pattern:GLushort);
매개변수 요소는 점선 템플릿 패턴의 반복 횟수를 나타냅니다. 요소의 값은 1255입니다. 패턴은 이진 시퀀스입니다.
glLineStipple(1,0,0x11C);{0x11C는 10001110으로 표현되며, 0은 점을 그리지 않음을 의미하고, 1은 점을 그리는 것을 의미합니다.}
예: 시작하다
glColor3f(1,0,0);
glLineWidth(2);
glLineStipple(1,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glEnd;
glDisable(GL_LINE_STIPPLE);
glColor3f(1,0,1);
glLineStipple(2,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.1);
glVertex2f(0.9,0.1);
glEnd;
glDisable(GL_LINE_STIPPLE);
SwapBuffers(Canvas.Handle);
끝;
다각형 그리기는 점 선 그리기와 유사합니다. 그릴 때 주의할 점은 GL_POLYGON, GL_QUADS, GL_TRANGLES입니다.
다각형의 변은 꼭지점에서만 교차합니다.
B 다각형은 볼록 다각형이어야 합니다. 오목 다각형인 경우 사용자는 그리기 속도를 높이기 위해 볼록 다각형으로만 접을 수 있습니다.
예: glBegin(GL_POLYGON);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glVertex2f(0.9,-0.6);
glVertex2f(0.5,-0.6);
glVertex2f(-0.9,-0.2);
glEnd;
다각형에는 앞면과 뒷면이 있으며, 이와 관련된 프로세스는 다음과 같습니다.
glPolygonMode는 다각형 전면 및 후면 그리기 모드를 제어합니다.
glFrontface는 다각형의 앞면을 지정합니다.
glCullFace는 면을 제거하도록 설정된 다각형을 표시합니다.
glPolygonStripple은 다각형 채우기 스타일을 형성합니다.
3. 단순 이차 곡면
원통, 고리, 구는 모두 2차 곡면입니다.
실린더
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,height:GLdouble,
슬라이스:GLint,스택:GLint);
qobj는 2차 표면을 지정하고, baseRadius는 원통의 기본 반경이고, height는 원통의 높이이고, Slices는 Z축 주위의 분할선 수입니다. Z축을 따라 선을 나누는 것입니다.
baseRadius와 topRadius가 같지 않으면 절두체와 원뿔을 그릴 수 있습니다.
절차 TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
시작하다
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluCylinder(qObj,0.5,0.1,0.2,10,10);
끝;
가져오다
gluDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
루프:GLint);
절차 TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
시작하다
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluDisk(qObj,0.2,0.5,10,5);
SwapBuffers(Canvas.Handle);
끝;
C 반원
gluPartialDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
루프:GLint,startAngle:GLdouble,sweepAngle:GLdouble);
startAngle,weepAngle은 반원의 시작 각도와 끝 각도입니다.
절차 TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
시작하다
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
SwapBuffers(Canvas.Handle);
끝;
D구
function gluSphere(qObj:GLUquadricObj,radius:GLdouble,slices:GLint,stacks:GLint);
절차 TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
시작하다
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
{ 실루엣[ silu(:)5et ]n. 실루엣, 윤곽선}
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
끝;
E 2차 곡면 처리에 대해
gluNewQuadric은 새로운 2차 표면 객체를 생성합니다.
gluDeleteQuadric은 2차 표면 객체를 삭제합니다.
gluQuadricDrawStyle은 그릴 4차 표면 유형을 지정합니다.
gluQuadricNormal은 2차 표면의 법선 벡터를 설정합니다.
gluQuadricOrientation은 2차 표면이 내부 회전되는지 또는 외부 회전되는지를 설정합니다.
gluQuadricTexture는 2차 표면이 텍스처를 사용하는지 여부를 설정합니다.
F 2차 곡면을 그리는 일반적인 단계
먼저 GLUquadricObj 객체를 정의합니다.
둘째, 표면 개체 gluNewQuadric을 만듭니다.
2차 곡면의 속성을 다시 설정합니다(gluQuadricDrawStyle, gluQuadricTexture).
2차 곡면 그리기(gluCylinder, gluSphere, gluDisk, gluPartialDisk)
6. OPENGL의 변환
변환은 그래픽 변환, 회전, 크기 조정 및 행렬을 통해 수학적으로 구현되는 기타 작업을 포함하는 애니메이션 디자인의 기초입니다.
glLoadIdentity 프로세스 1개
현재 행렬을 단위 행렬로 변환할 수 있습니다.
2 glLoadMatrix 프로세스
지정된 행렬을 현재 행렬로 설정할 수 있습니다.
절차 glLoadmatrixd(m:GLdouble);
절차 glLoadmatrixf(m:GLfloat);
m은 4X4 행렬을 나타내며, 다음 코드는 이를 정의하고 현재 행렬로 만듭니다.
M:GLfloat의 배열[1..4,1..4];
glLoadMatrix(@M);
3 glMultMatrix 프로세스
현재 순간에 지정된 행렬을 곱하고 그 결과를 현재 순간으로 사용할 수 있습니다.
절차 glMultMatrixd(M:GLdouble);
절차 glMultMatrixf(M:GLfloat);
4 glPushMatrix 및 glPopmatrix
glPushMatrix는 현재 순간을 매트릭스 스택으로 푸시할 수 있고, glPopMatrix는 현재 순간을 매트릭스 스택에서 팝할 수 있습니다.
glPushMatrix는 행렬의 현재 위치를 기억할 수 있고 glPopmatrix는 이전 위치를 반환할 수 있습니다.
참고: glPushMatrix 및 glPopMatrix는 glBegin 및 glEnd 외부에 배치되어야 합니다.
5 투영 변환
glOrtho는 직교 투영 행렬을 생성하고, 현재 순간에 직교 투영 행렬을 곱하고, 그 결과를 현재 행렬로 사용할 수 있습니다.
함수 glOrtho(왼쪽:GLdouble,오른쪽:GLdouble,아래쪽:GLdouble,위쪽:GLdouble,
근거리:GLdouble, 원거리:GLdouble);
절차 TfrmMain.FormResize(Sender: TObject);
var
nRange:GLfloat;
시작하다
n범위:=50.0;
w:=클라이언트폭;
h:=클라이언트 높이;
h=0이면
h:=1;
glViewPort(0,0,w,h);
w<=h이면
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
-n범위,n범위)
또 다른
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRange,nRange);
다시 칠하다;
끝;
B glOrtho2D는 직교 보기 볼륨의 앞, 뒤, 왼쪽 및 오른쪽만 정의합니다.
절차 glOrtho(왼쪽:GLdouble,오른쪽:GLdouble,아래쪽:GLdouble,위쪽:GLdouble);
C glMatrixMode 프로시저
현재 연산 행렬의 유형을 설정하는 기능
절차 glMatrixMode(mode:GLenum);
모드 값:
GL_MODELVIEW는 후속 행렬 연산이 모델 행렬 스택임을 지정합니다.
GL_PROJECTION은 후속 행렬 연산이 투영 행렬 스택이 되도록 지정합니다.
GL_TEXTURE는 후속 행렬 작업이 텍스처 행렬 스택임을 지정합니다.
D glFrustum 프로세스
원근 경사 투영 행렬을 만들고 현재 행렬에 경사 투영 행렬을 곱하면 결과가 현재 행렬이 됩니다.
절차 glFrustum(왼쪽:GLdouble,오른쪽:GLdouble,아래쪽:GLdouble,위쪽:GLdouble,
다음:GLdouble,far:GLdouble);
이러한 매개변수는 경사 투영의 왼쪽, 오른쪽, 위쪽, 아래쪽, 앞쪽 및 뒤쪽 자르기 평면을 정의합니다.
E gluPerspective 프로세스
Z축을 중심선으로 하여 4면 피라미드 보기 볼륨을 정의할 수 있습니다.
절차 gluPerspetive(fovy:GLdouble,aspect:GLdouble,zNear:GLdouble,zFar:GLdouble);
fovy는 xoz 평면의 원근을 정의하고, Aspect는 x와 y 방향의 비율을 정의하며, zNear 및 zFar는 각각 시점에서 클리핑 평면과 후면 클리핑 평면까지의 거리를 정의합니다.
절차 TfrmMain.FormResize(Sender: TObject);
var
측면:GLfloat;
시작하다
w:=클라이언트 너비;
h:=클라이언트 높이;
h=0이면
h:=1;
glViewPort(0,0,클라이언트 너비,클라이언트 높이);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
측면:=w/h;
gluPerspective(30.0,측면,1.0,50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
끝;
6 기하변환행렬
3차원 물체의 이동 자세 변형은 물체의 이동, 회전, 크기 조정을 의미합니다.
glTranslate 프로세스는 좌표 원점을 (x, y, z)로 이동할 수 있으며 해당 선언 구문은 다음과 같습니다.
절차 glTranslated(x:GLdouble,y:GLdouble,z:GLdouble);
절차 glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);
B glRotate는 객체를 특정 각도로 회전할 수 있습니다. 선언 구문은 다음과 같습니다.
절차 glRotated(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
절차 glRotatef(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
그 중 angle 은 회전 각도이고, 회전 중심축은 두 점 (0,0,0)과 (x,y,z)를 연결하는 선입니다.
C glScale은 좌표계의 크기를 조정할 수 있으며 선언 구문은 다음과 같습니다.
절차 glScaled(x:GLdouble,y:GLdoble,z:GLdouble);
절차 glScalef(x:GLdouble,y:GLdoble,z:GLdouble);
x, y, z의 값이 1보다 크면 확대를 나타내고, 1보다 작은 값은 축소를 나타냅니다.
원본 코드 예:
단위 MainFrm;
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화상자, OpenGL, ExtCtrls;
유형
TfrmMain = 클래스(TForm)
타이머1: T타이머;
절차 FormCreate(보내는 사람: TObject);
절차 FormDestroy(보내는 사람: TObject);
절차 FormPaint(보내는 사람: TObject);
절차 FormKeyDown(Sender: TObject; var Key: Word;
시프트: TShiftState);
절차 FormResize(Sender: TObject);
절차 Timer1Timer(Sender: TObject);
절차 FormClose(Sender: TObject; var Action: TCloseAction);
사적인
{비공개 선언}
hrc:HGLRC;
w,h:정수;
위도,경도:GLfloat;
반경:GLdouble;
공공의
{공개 선언}
절차 MyDraw;
절차 초기화GL(var width:GLsizei;height:GLsizei);
끝;
var
frmMain: TfrmMain;
구현
{$R *.dfm}
절차 TfrmMain.FormCreate(Sender: TObject);
var
pfd:TPixelFormatDescriptor;
PixelFormat:정수;
시작하다
컨트롤스타일:=컨트롤스타일+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
pfd와 함께
시작하다
nSize:=sizeof(TPixelFormatDescriptor);
n버전:=1;
dwFlags:=PFD_DRAW_TO_WINDOW 또는
PFD_SUPPORT_OPENGL 또는 PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
끝;
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=ClientRect.Right;
h:=ClientRect.Bottom;
초기화GL(w,h);
끝;
절차 TfrmMain.FormDestroy(Sender: TObject);
시작하다
wglDeleteContext(hrc);
끝;
절차 TfrmMain.FormPaint(Sender: TObject);
시작하다
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
마이드로;
glFlush;
끝;
절차 TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
시작하다
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT 또는 GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glRotated(0.5,0.0,1.0,0.0);
glRotated(-위도,1.0,0.0,0.0);
glrotated(경도,0.0,0.0,1.0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
끝;
{절차 TfrmMain.FormResize(Sender: TObject);
var
nRange:GLfloat;
시작하다
n범위:=50.0;
w:=클라이언트폭;
h:=클라이언트 높이;
h=0이면
h:=1;
glViewPort(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
w<=h이면
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
-nRange,nRange)
또 다른
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRange,nRange);
glMatrixMode(GL_MODELVIEW);
glLoadidentity;
다시 칠하다;
끝;
}
절차 TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
시프트: TShiftState);
시작하다
Key=VK_ESCAPE이면
닫다;
Key=VK_UP이면
glRotatef(-5,1.0,0.0,0.0);
Key=VK_DOWN이면
glRotatef(5,1.0,0.0,0.0);
Key=VK_LEFT이면
glRotatef(-5,0.0,1.0,0.0);
Key=VK_RIGHT이면
glRotatef(5.0,0.0,1.0,0.0);
다시 칠하다;
끝;
절차 TfrmMain.FormResize(Sender: TObject);
시작하다
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,clientWidth,clientHeight);
다시 칠하다;
무효화하다;
끝;
절차 TfrmMain.InitializeGL(var 너비: GLsizei; 높이: GLsizei);
var
maxObjectSize,aspect:GLfloat;
Near_plane:GLdouble;
시작하다
glClearindex(0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
측면:=1.0;
gluPerspective(45.0,aspect,3.0,7.0);
glmatrixMode(GL_MODELVIEW);
Near_plane:=0.3;
maxObjectSize:=0.3;
반경:=near_plane+maxObjectSize/2.0;
위도:=0.3;
경도:=0.6;
끝;
절차 TfrmMain.Timer1Timer(Sender: TObject);
시작하다
타이머1.활성화:=false;
마이드로;
생산하다;
타이머1.활성화:=true;
끝;
절차 TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
시작하다
타이머1.활성화:=false;
hrc<>null이면
wglDeleteContext(hrc);
끝;
끝.
7. OPENGL의 조명과 질감
이는 모두 입체감과 색상 효과를 높이기 위한 수단입니다. 조명은 그래픽의 밝기와 입체감을 높일 수 있고, 질감은 그래픽을 더욱 사실적으로 만들 수 있습니다. 조명을 이용하면 사물의 모습을 강렬하게 표현할 수 있고, 질감을 통해 사물의 모습을 다양하게 표현할 수 있다.
1 조명 및 광원 공정과 응용
glIndex 프로시저는 색상 인덱스 테이블의 색상을 현재 색상으로 만듭니다.
절차 glIndexd(c:GLdouble);
절차 glIndexf(c:GLdouble);
절차 glIndexi(c:GLdouble);
절차 glIndexs(c:GLdouble);
매개변수 C는 인덱스 값입니다. glIndex 프로시저가 사용되는 경우 TPiexlFormatDescriptor 구조의 iPixelType 멤버는 PFD_TYPE_COLORINDEX로 설정됩니다.
B glShadeModel 절차
glShadeModel 프로세스는 채우기 모드 값을 GL_SMOOTH로 설정합니다.
절차 glShadeModel(mode:GLenum);
참고: 위의 두 프로세스는 glBegin....glEnd 외부에서만 사용할 수 있습니다.
C glLight 프로시저는 광원을 정의합니다.
절차 glLightf(light:GLenum,pname:GLenum,param:GLfloat);
절차 glLighti(light:GLenum,pname:GLenum,param:GLfloat);
매개변수 light는 광원을 정의하며 그 값은 GL_LIGHT0...GL_LIGHTN일 수 있으며 N 값은 GL_MAX_LIGHT보다 작습니다.
매개변수 pname은 광원 매개변수를 지정합니다.
주변광의 GL_AMBIENT 구성요소 강도
산란광의 GL_DIFFUSE 구성요소 강도
반사광의 GL_SPECULAR 구성요소 강도
GL_POSITION 광원 위치
GL_SPOT_DIRECTION 광원의 초점 방향
GL_SPOT_EXPONENT 광원 인덱스
GL_SPOT_CUTOFF 광원 방향
GL_CONSTANT_ATTENUATION 조명 상수 감쇠 인자
GL_LINEAR_ATTENUATION 가벼운 2차 감쇠 계수
glEnable() 및 glDisable() 프로시저를 사용하여 광원을 활성화하고 끄십시오.
glEnable(GL_LIGHTING); //광원 활성화
glDisable(GL_LIGHTING); //광원 끄기
glEnable(GL_LIGHT0); //0번째 광원을 활성화합니다.
glDisable(GL_LIGHT0); //0번째 광원 끄기
광원 설정 예:
var
GLfloat:={0.0,1.0,0.0,0.0}의 방향:배열[1..4];
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,60);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,sdirection);
2 재료 및 조명 모델
glMaterial 프로시저는 재료 매개변수를 설정합니다.
절차 glMaterialf(얼굴:GLenum,pname:GLenum,param:GLfloat);
절차 glMateriali(얼굴:GLenum,pname:GLenum,param:GLfloat);
절차 glMaterialfv(얼굴:GLenum,pname:GLenum,param:GLfloat);
절차 glMaterialiv(얼굴:GLenum,pname:GLenum,param:GLfloat);
얼굴 매개변수는 객체의 표면을 지정하며 해당 값은 GL_FRONT, GL_BACK, GL_FRONT_BACK입니다.
pname,param은 이 자료에 소개되지 않습니다.
B glLightModel 프로세스
절차 glLightModelf(pname:GLenum,param:GLfloat);
매개변수 pname은 GL_LIGHT_MODEL_AMBIENT 값을 취할 수 있는 광원 모델 매개변수입니다.
GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_TWO_SIDE.
예제 코드:
절차 TfrmMain.SetLighting;
var
MaterialAmbient:GLfloat의 배열[1..4];
MaterialDiffuse:GLfloat의 배열[1..4];
MaterialSpecular:GLfloat의 배열[1..4];
AmbientLightPosition:GLfloat의 배열[1..4];
LightAmbient:GLfloat의 배열[1..4];
재료광택:GLfloat;
시작하다
MaterialAmbient[1]:=0.5;
MaterialAmbient[2]:=0.8;
MaterialAmbient[1]:=0.2;
MaterialAmbient[1]:=1.0;
재질확산[1]:=0.4;
머티리얼디퓨즈[2]:=0.8;
재질확산[3]:=0.1;
머티리얼디퓨즈[4]:=1.0;
머티리얼스페큘러[1]:=1.0;
머티리얼스페큘러[2]:=0.5;
머티리얼스페큘러[3]:=0.1;
머티리얼스페큘러[4]:=1.0;
재료광택:=50.0;
주변광 위치[1]:=0.5;
주변광 위치[2]:=1.0;
주변광 위치[3]:=1.0;
주변광 위치[4]:=0.0;
LightAmbient[1]:=0.5;
LightAmbient[2]:=0.2;
LightAmbient[3]:=0.8;
LightAmbient[4]:=1.0;
glMaterialfv(GL_FRONT,GL_AMBIENT,@MaterialAmbient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,@MaterialShininess);
glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLSadeModel(GL_SMOOTH);
끝;
3 질감 적용
glTexImage1D는 1차원 텍스처 맵을 정의합니다.
절차 glTexImage1D(대상:GLenum,레벨:GLint,구성 요소:GLint,너비:GLsizei,
테두리:GLint, 형식:GLenum, 유형:GLenum,픽셀:GLvoid);
매개변수 targer 값은 GL_TEXTURE_1D이며 텍스처 매핑으로 정의되며 level은 다단계 해상도의 텍스처 이미지 레벨, width는 텍스처 너비, 값은 2n, n 값은 32, 64, 129입니다. 등. Border는 텍스처의 경계이고 그 값은 0 또는 1입니다. Pixel은 메모리 내 텍스처의 위치입니다. Component는 RGBA의 혼합 및 조정을 지정합니다.
1B성분을 선택하세요
2재료 B와 A를 선택하세요
3R, G, B 성분을 선택하세요
4R,G,B,A 성분 선택
B glTexImage2D는 2차원 텍스처 매핑을 정의합니다.
절차 glTexImage2D(대상:GLenum,레벨:GLint,구성 요소:GLint,너비:GLsizei,
테두리:GLint, 형식:GLenum, 유형:GLenum,픽셀:GLvoid);
매개변수 대상이 GL_TEXTURE_2D인 경우 의미는 2차원 텍스처 매핑이고, height는 텍스처의 높이이며, 함수 내 다른 매개변수는 glTexImage1D와 동일합니다. 컴포넌트 매개변수의 값은 위와 같습니다.
예제 코드:
절차 TfrmMain.SetTextures;
var
비트:GLubyte의 배열[1..64,1..64,1..64];
bmp:TBitmap;
i,j:정수;
시작하다
bmp:=TBitmap.Create;
bmp.LoadFromFile('d:/dsoft/1119/01/logon.bmp');
i:=1 ~ 64 do
j:=1 ~ 64의 경우 do
시작하다
비트[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
비트[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
비트[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
비트[i,j,4]:=255;
끝;
{0은 단일 색상 음영 수준을 나타내고, GL_RGBA는 혼합 값을 나타냅니다.
64X64는 텍스처의 높이와 너비를 나타내고, 0은 테두리가 없음을 나타냅니다.
gl_rgba는 텍스처 유형을 나타내며, gl_unsigned_type는 데이터 유형, @generation 객체 주소를 나타냅니다}
glteximage2d (gl_texture_2d, 0, Gl_rgba, 64,64,0, Gl_rgba,
gl_unsigned_byte,@bits);
glenable (gl_texture_2d);
끝;
C gltexparameter 프로 시저를 설정합니다
절차 gltexparameterf (target : glenum, pname : glenum, param : glfloat);
절차 gltexparameteri (target : glenum, pname : glenum, param : glfloat);
매개 변수 대상은 gl_texture_1d 또는 gl_texture_2d를 나타내고 매개 변수는 텍스처 값입니다.
d gltexenv 함수는 텍스처의 환경 매개 변수를 설정합니다.
함수 gltexenvf (target : glenum, pname : glenum, param : glfloat);
함수 gltexenvi (target : glenum, pname : glenum, param : glfloat);
매개 변수 대상은 gl_texture_env입니다.
매개 변수 pname은 텍스처 매개 변수 값이고 값은 gl_texture_env_mode입니다.
매개 변수 매개 변수는 환경 값이며 그 값은 GL_MODULATE, GL_DECAL 및 GL_BLEND입니다.
이 프로그램의 샘플 코드 :
단위 메인 프리;
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화 상자, OpenGl, extCtrls;
유형
tfrmmain = class (tform)
타이머1: T타이머;
절차 FormCreate(보내는 사람: TObject);
절차 formdestroy (sender : tobject);
절차 formpaint (발신자 : Tobject);
절차 공포 다운 (Sender : Tobject; var 키 : Word;
시프트: TShiftState);
절차 공식화 (발신자 : Tobject);
절차 Timer1Timer(Sender: TObject);
절차 FormClose(Sender: TObject; var Action: TCloseAction);
사적인
{비공개 선언}
HRC : HGLRC;
W, H : 정수;
위도, 경도 : glfloat;
반경 : Gldouble;
공공의
{공개 선언}
절차 세트 조명;
절차 setTextures;
절차 myDraw;
절차 초기화 GLEGL (var width : glsizei; 높이 : glsizei);
끝;
var
frmmain : tfrmmain;
구현
{$R *.dfm}
절차 tfrmmain.formcreate (sender : tobject);
var
PFD : tpixelformatdescriptor;
PixelforMat : 정수;
시작하다
ControlStyle : = ControlStyle+[CSOPAQUE];
충전재 (PFD, 크기 (PFD), 0);
PFD와 함께
시작하다
nsize : = sizeof (tpixelformatdescriptor);
nversion : = 1;
dwflags : = pfd_draw_to_window 또는
pfd_support_opengl 또는 pfd_doublebuffer;
iPixelType : = PFD_TYPE_RGBA;
ccolorbits : = 24;
cdepthbits : = 32;
ilayertype : = pfd_main_plane;
끝;
pixelformat : = ChoosepixelforMat (canvas.handle,@pfd);
setpixelformat (canvas.handle, pixelformat,@pfd);
HRC : = wglcreateContext (canvas.handle);
W : = ClientRect.right;
H : = ClientRect.Bottom;
Initializegl (w, h);
끝;
절차 tfrmmain.formdestroy (sender : tobject);
시작하다
wgldeletecontext (HRC);
끝;
절차 tfrmmain.formpaint (sender : tobject);
시작하다
wglmakecurrent (Canvas.handle, HRC);
glclearcolor (1,1,1,1);
glcolor3f (1,0,0);
glclear (gl_color_buffer_bit 또는 gl_depth_buffer_bit);
setTextures;
myDraw;
세트 조명;
glflush;
끝;
절차 tfrmmain.myDraw;
var
QOBJ : gluquadricobj;
시작하다
glpushmatrix;
glclear (gl_color_buffer_bit 또는 gl_depth_buffer_bit);
glcolor3f (1,0,0);
glrotated (0.5,0.0,1.0,0.0);
glrotated (-latitude, 1.0,0.0,0.0);
glrotated (경도, 0.0,0.0,1.0);
qobj : = glunewquadric;
gluquadricdrawStyle (qobj, glu_line);
글루 스페 (Glusphere) (QOBJ, 0.5,20,20);
스왑 버퍼 (canvas.handle);
세트 조명;
setTextures;
끝;
{절차 tfrmmain.formresize (sender : tobject);
var
Nrange : Glfloat;
시작하다
NRANGE : = 50.0;
W : = ClientWidth;
H : = ClientHeight;
h = 0이면
H : = 1;
Glviewport (0,0, W, H);
glmatrixmode (gl_projection);
glloadidentity;
w <= h 인 경우
glortho (-nrange, nrange, -nrange*h/w, nrange*h/w,
-Nrange, nrange)
또 다른
glortho (-nrange*h/w, nrange*h/w, -nrange, nrange,
-nrange, nrange);
glmatrixmode (gl_modelview);
glloadidentity;
리 페인트;
끝;
}
절차 tfrmmain.formkeydown (발신자 : Tobject; var 키 : Word;
시프트: TShiftState);
시작하다
key = vk_escape라면
닫다;
key = vk_up 인 경우
glrotatef (-5,1.0,0.0,0.0);
key = vk_down 인 경우
glrotatef (5,1.0,0.0,0.0);
key = vk_left라면
glrotatef (-5,0.0,1.0,0.0);
key = vk_right라면
glrotatef (5.0,0.0,1.0,0.0);
리 페인트;
끝;
절차 tfrmmain.formresize (sender : tobject);
시작하다
glmatrixmode (gl_projection);
glloadidentity;
glfrustum (-1.0,1.0, -1.0,1.0,3.0,7.0);
Glviewport (0,0, ClientWidth, ClientHeight);
리 페인트;
무효화하다;
끝;
절차 tfrmmain.initializegl (var width : glsizei; 높이 : glsizei);
var
MaxObjectsize, 측면 : Glfloat;
니어 _plane : gldouble;
시작하다
glclearIndex (0);
glcleardepth (1.0);
glenable (gl_depth_test);
glmatrixmode (gl_projection);
측면 : = 1.0;
gluperspective (45.0, 측면, 3.0,7.0);
glmatrixmode (gl_modelview);
니어 _plane : = 0.3;
MaxObjectSize : = 0.3;
반경 : = 근접 _plane+maxObjectSize/2.0;
위도 : = 0.3;
경도 : = 0.6;
끝;
절차 tfrmmain.timer1timer (sender : tobject);
시작하다
타이머1.활성화:=false;
myDraw;
생산하다;
timer1.enabled : = true;
끝;
프로 시저 tfrmmain.formclose (발신자 : tobject; var action : tcloseacect);
시작하다
타이머1.활성화:=false;
hrc <> null이면
wgldeletecontext (HRC);
끝;
절차 tfrmmain.setlighting;
var
Materialambient : Glfloat의 배열 [1..4];
MaterialDiffuse : Glfloat의 배열 [1..4];
소재 : Glfloat의 배열 [1..4];
AmbientlightPosition : Glfloat의 배열 [1..4];
Lightambient : Glfloat의 배열 [1..4];
물질적 인 느낌 : Glfloat;
시작하다
materialambient [1] : = 0.5;
materialambient [2] : = 0.8;
materialambient [1] : = 0.2;
materialambient [1] : = 1.0;
MaterialDiffuse [1] : = 0.4;
MaterialDiffuse [2] : = 0.8;
MaterialDiffuse [3] : = 0.1;
MaterialDiffuse [4] : = 1.0;
재료 특성 [1] : = 1.0;
재료 특성 [2] : = 0.5;
재료 특성 [3] : = 0.1;
재료 특성 [4] : = 1.0;
물질적 인 느낌 : = 50.0;
AmbientlightPosition [1] : = 0.5;
AmbientlightPosition [2] : = 1.0;
AmbientlightPosition [3] : = 1.0;
AmbientlightPosition [4] : = 0.0;
lightambient [1] : = 0.5;
lightambient [2] : = 0.2;
lightambient [3] : = 0.8;
lightambient [4] : = 1.0;
glmaterialfv (gl_front, gl_ambient,@materialambient);
glmaterialfv (gl_front, gl_diffuse,@aterationdiffuse);
glmaterialfv (gl_front, gl_specular,@wasionalspecular);
glmaterialfv (gl_front, gl_shininess,@materialshininess);
gllightfv (gl_light0, gl_position,@ambientlightposition);
gllightmodelfv (gl_light_model_ambient,@lightambient);
glenable (gl_lighting);
glenable (gl_light0);
Glshademodel (Gl_smooth);
끝;
절차 tfrmmain.settextures;
var
비트 : Glubyte의 배열 [1..64,1..64,1..64];
BMP : TBITMAP;
I, J : 정수;
시작하다
bmp : = tbitmap.create;
bmp.loadfromfile ( 'd : /dsoft/1119/02/logon.bmp');
i : = 1 ~ 64 do
J : = 1 ~ 64 do
시작하다
비트 [i, j, 1] : = glbyte (getrvalue (bmp.canvas.pixels [i, j]));
비트 [i, j, 2] : = glbyte (getrvalue (bmp.canvas.pixels [i, j]));
비트 [i, j, 3] : = Glbyte (getrvalue (bmp.canvas.pixels [i, j]));
비트 [I, J, 4] : = 255;
끝;
glpixelstorei (gl_unpack_alignment, 4);
gltexparameteri (gl_texture_2d, gl_texture_wrap_s, gl_clamp);
gltexparameteri (gl_texture_2d, gl_texture_mag_filter, gl_nearest);
gltexparameteri (gl_texture_2d, gl_texture_min_filter, gl_nearest);
{0은 단일 색상 음영 수준을 나타내고 GL_RGBA는 혼합 값을 나타냅니다.
64x64는 텍스처의 높이와 너비를 나타내고 0은 경계가 없으며,
gl_rgba는 텍스처 유형을 나타내며, gl_unsigned_type는 데이터 유형, @generation 객체 주소를 나타냅니다}
glteximage2d (gl_texture_2d, 0, Gl_rgba, 64,64,0, Gl_rgba,
gl_unsigned_byte,@bits);
glenable (gl_texture_2d);
gltexenvf (gl_texture_env, gl_texture_env_mode, gl_decal);
끝;
끝.