*OpenGL ES를 하기전 OpenGL 이론부터 다루고 있습니다.

 본격적인 ES는 다음편부터 입니다.


OpenGL ES: 기초 및 입문 (1)

OpenGL ES: 기초 및 입문 (2)

OpenGL ES: 기초 및 입문 (3)

OpenGL ES: 기초 및 입문 (4)

OpenGL ES: 기초 및 입문 (5)






1. 기본 이론, OpenGL


1) 기초

① 특성

> OpenGL 자체는 C 언어로 제작되었지만 함수 수준의 라이브러리이므로 특정 언어에 종속되지는 않는다

> gl 라이브러리의 함수는 gl 접두어로 시작하고 glu의 라이브러리는 glu로 시작한다. 마찬가지로 glut 소속의 함수는 glut 접두가 붙는다. 접두만으로도 OpenGL 함수임을 쉽게 알 수 있다.

-SoEn:소프트웨어 공학 연구소-


② 좌표

[#출처]

> openGL은 오른손 좌표계 사용.

> 이 경우

   X축: 엄지 / Y축: 검지 / Z축: 중지(손가락끝이 화면에서 사람눈쪽, 손가락 방향으로 Z+)

   혹은

   X축: 검지 / Y축: 중지 / Z축: 엄지(손가락끝이 화면에서 사람눈쪽, 손가락 방향으로 Z+)

> 사족으로 X축=끄덕축, Y축=도리축, Z축은 갸웃축으로도 불린다.



2) 주요 용어

 정점, Vertex

 삼각폴리곤의 꼭지점들에 해당하는 부분.

 오직 위치값만 가지고 있어서 3D에서 원자같은 요소이다. (색상이나 크기에 대한 정보X)

 상태 머신 그리기 함수 이전에 필요한 정보값들이 저장됨.
> 좌표/색상/굵기/모양/조명 등등.

 안티 얼라이싱,

 Anti Aliasing

 서로 다른 색상으로 채워진 픽셀들의 경계를 중간색을 넣는 방식이 가장 일반적.

 혹은 계단현상등이 발생하는 이미지를 좀더 자연스러 보이게 사용하기도.

 에지 플래그

 OpenGL 규칙상 다각형에 오목한게 있으면 안 된다고 한다.
 하지만 3D에서 폴리곤은 기본적으로 삼각형이라 원하는 다각형을 폴리곤으로 형태를 맞춘뒤, 이 엣지플래그로 도형 내부 선만 안보이게 처리하면 가능하다.
 * 실질적으로 쓰임새는 적어보인다. 다만 특수한 연출등에서 간간히 쓰일 여지는 있다.



3) 기본 흐름

1
2
3
4
5
6
7
glClearColor(R, G, B, Alpha);//각 함수인자들은 0~1.0f. 단 배경은 새로 지정하지 않는 이상 유지
glClear(GL_COLOR_BUFFER_BIT);
 
glBegin(GL_TRIANGLES);
... ... ...//그려넣을 내용물. 단, ES에서는 그리기 함수 호출불가&정점 배열만 사용가능
glEnd();
glFlush();
cs



4) 미분류

> OpenGL은 이미지 파일을 읽는 기능을 제공하지 않아서 운영체제별로 이미지 읽기 함수등을 별도로 만들어야 한다.

> glFuncName[2,3,4][s,i,f,d]인 경우,

   2~4가 처리할 함수인자 갯수, 함수명 맨끝의 알파벳 표기는 처리할 타입(short, int, float, double)






2. 파이프라인


1) 절차

[#출처, OpenGL Rendering Pipeline]



① 지오메트리 패스(Geometry Path)

 Vertex Operations

 정점 (Verteces)를 직선 및 다각형으로 변환(Primitives)
 일부 정점 데이터가 3차원 입체 오브젝트를 2차원으로 출력(혹은 투영)되는 스크린에 맞게 변환할때 4x4 부동 소수점 행렬을 통해 처리된다.

 Primitive Assembly

 안 보이는 부분을 잘라내는 작업을 처리(클리핑)
 여기서 나오는 결과물에 색상/깊이/텍스쳐좌표등이 존재. (일종의 상태머신?)


② 이미지 패스(Image Path)

 Pixel Transfer Operation 메모리에 있는 픽셀 데이터를 Unpacking


③ 나머지

 Display List

 랜더링 성능향상과 관련있음.
> #[OpenGL Tutorial] Display List

 Texture Memory

 (Texture Assembly)

 '텍스쳐 바르기'로도 불리는 과정

 Rasterization

 앞서 처리한것들을 프레그멘트로 넣는다. (프레그멘트에 인쇄하는 과정이라는 설명도 있다.)

 Fragment Operation

 프레임 버퍼(Frame Bufer)에 저장하기전 여러 테스트과정이 있다.
> Scissor 테스트, 알파 테스트(투명도 테스트), 스텐실 테스트, 깊이 테스트 등등.

 Frame Bufer

 glGenFramebuffers

> #Framebuffers - Learn OpenGL

 랜더링을 위한 버퍼 모음집이다.

 openGL에는 2가지 프레임 버퍼가 존재하는데, Default Framebuffer와 Framebuffer Objects(FBOs, user-created framebuffers)이다.



2) 버퍼


① 주요버퍼

> glClear함수 인자를 지정해서 사용.

Fragment Operation에서 테스트전 연관된 버퍼가 할당되어야 한다.

   또한 대부분의 버퍼는 각자 연관된 마스크가 있다.  #opengl.org/wiki, Write Mask

#OpenGL - Depth and stencils

 Color Buffer

 알파 테스트와 연관된 버퍼.
 프론트&백 버퍼를 이용한 더블버퍼 방식
 Stencil Buffer 스텐실 테스트와 연관된 버퍼.
 원하는 부분만 그리고 싶을때 사용
 Depth Buffer 깊이 테스트와 연관된 버퍼.

 Accumulattion Buffer

 일반적으로 연산처리후의 이미지에 사용되며, 해당 버퍼에 직접 그릴수는 없다.


② 블렌딩

화면에 그려진 출력물은 '색상버퍼'에 저장

> 같은 위치에 다르 그림을 그리면 이전에 저장된 내용물은 덧씌워진다.

   여기서 블렌딩은 색상버퍼에 이미 저장된 내용물과 새로 저장되는 내용물에 대한 논리적 연산을 정의

   어떻게 보면 캔버스상에서 레이어들을 겹치는것과 유사.

> glEnable(GL_BLEND); // glBegin 사용전 호출.

Unavailable :: OpenGL 블렌딩


③ 디더링(Ditherring)

> glEnable(GL_DITHER);


④ 테스트

Fragment Operation에서 테스트전 연관된 버퍼가 할당되어야 한다.

 Scissor Test

 glEnable(GL_SCISSOR_TEST);
 glScissor(x, y, width, height);
 테스트들중 가장 간단하다.(제약이 커서?)
 Alpha Test glEnable(GL_ALPHA_TEST);

 Stencil Test

 glEnable(GL_STENCIL_TEST);
 Depth Test glEnable(GL_DEPTH_TEST);


⑤ 기타

> 기본적으로 CALayers는 투명하지만, OpenGL 에서는 성능상의 이유로, 불투명하게 하는게 좋다






3. 카메라와 행렬


1) 투영

> 3차원 공간의 오브젝트를 2차원인 디스플레이로 투영하려면

   로컬 좌표 -> 월드 좌표 -> 카메라 좌표 -> 투영

> [#참조]

투시투영(Perspective Projection)

직교투영(Orthographic Projection)

 원근표현이 있는 입체적인 뷰포트(Z좌표 영향O)

 주로 3D게임에서 활용도가 높음.

 (카메라 범위내)근평면(near plane)에서 끝평면(far plane)으로 갈수록 넓어짐.

 원근표현이 전혀 없는 평면적인 뷰포트(Z좌표 영향X)

 주로 2D게임에서 활용도가 높음.

 (카메라 범위내)근평면(near plane)에서 끝평면(far plane)이 동일한 면적.



2) 좌표와 행렬

 월드 좌표

 디스플레이상 표현되는 좌표.

> 워드 프로세서로 치면 특정 단어의 위치를 표현시 N줄 K열로 표기하는셈

 로컬 좌표

 오브젝트 내부에 포함된 좌표.

> 워드 프로세서에 들어가는 글자 1칸마다의 내부 좌표격.

> 오브젝트 갯수만큼 존재

 카메라 좌표

> #참고자료, 다크 프로그래머 :: 3D 좌표계 변환 방법 (예: 월드좌표계 - 카메라 좌표계)






4. 텍스쳐


1) 비트맵

> 미리 만들어진 이미지. 다양한 크기와 색상 존재가능.

> "대용량의 래스터 데이터로 구성되므로 파일 형태로 저장되는 것이 일반적이다. 그러나 안타깝게도 OpenGL은 파일 입출력 기능을 제공하지 않으므로 파일이나 리소스로부터 비트맵을 생성하기 어렵다. 간단한 이미지라면 메모리에서 래스터 데이터를 직접 정의하여 만들어 써야 한다."[각주:1]

> 3차원 그래픽에서 글꼴을 비트맵으로 처리하는 경우가 많다.

> 싱글 버퍼일땐 프론트 버퍼, 더블 버퍼링에서는 백 버퍼에서 실행.


① 관련 주요함수

 glPixelStore[f, i](GLenum pname, GLfloat param)

 glRasterPos[2,3,4][s,i,f,d][v](x, y, z,w)

 glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap);



2) 픽셀맵

① 관련 주요함수

1
2
3
4
5
6
void glDrawPixels(   GLsizei        width,
                     GLsizei        height,
                     GLenum         format,
                     GLenum         type,
                     const GLvoid * data);
 
cs

> glFuncName[2,3,4][s,i,f,d]인 경우,

   2~4가 처리할 함수인자 갯수, 함수명 맨끝의 알파벳 표기는 처리할 타입(short, int, float, double)



3) 텍스처 맵핑

> 흔히 '텍스쳐를 발라 붙인다'/'텍스쳐를 입힌다'등으로 표현되는 기법.

> 텍스처의 좌하단은 (0,0)이고 우상단은 (1,1)이고, 중앙이 (0.5, 0.5)

> 버텍스와 텍스쳐 내부 좌표를 대응시키는것으로 출력처리가 된다.

> 텍스쳐 필터링


① 관련 주요함수

1
2
3
4
5
6
7
glEnable(GL_TEXTURE_2D)  //함수인자에 1~3차원 이미지 가능. ES는 2차원만 가능.
glTexImage2D(GLenum target, GLint level, GLint internalFormat,
             GLsizei width, GLsizei height,
             GLint border, GLenum format, GLenum type, const GLvoid * data)
glTexCoord[1,2,3,4][s,i,f,d][v](s, t, r, q)
glTexEnv[f, i](GLenum target, GLenum pname, GLfloat param)
 
cs






5. 조명


1) 조명의 요소[각주:2]

 환경광
 (Ambient Light)

 다른 표면에서 반사된 빛을 받는것.

 반사된 빛을 비교적 저렴하고 간단하게 구현하는 방법.

 난반사광

 (Diffuse Light)

 모든 방향으로 동일하게 반사되므로 위치와는 관계없이 관찰자의 눈에 빛이 도달하고 관찰자의 위치를 고려할 필요가 없다.

 정반사광

 (Specular Light)

 특정한 방향으로 진행하며, 표면에 닿으면 한 방향으로 강하게 반사하여 특정한 각도에서만 관찰할 수 있다. 관찰자의 시점을 모두 고려해야 한다.

 퐁
 (Phong, Combined Light)

 연산비용이 가장 비싸지만, 완성도가 가장 높은 조명이다.

> glLight 함수 인자중 조명번호에 따르면 조명은 총 8개가 존재.(2^8로 총 256가지 조합?)

> 조명의 디폴트는 모두 (0,0,0,1)로 화면상 암흑상자가 된다.



2) 재질

1
2
void glDisable( GLenum cap);
void glColorMaterial(GLenum face, GLenum mode);
cs

> glMaterial[f, i][v](GLenum face, GLenum pname, GLfloat* param)로 조명의 어떤 색상을 반사할지 지정

   이는 물체의 색상이 사람의 눈에 어떻게 닿는지의 원리와 같다.

   재질에 대한 작업은 '빛의 반사'에 대한 처리라서 glColor로 입력된 색상을 무시가능. 만약 재질이 아닌 glColor 색상을 적용 하려면 색상 트래킹으로 처리.

> # Materials - Learn OpenGL



3) 법선

1
void glNormal3[f,d,i,s,b][v](GLfloat nx, GLfloat ny, GLfloat nz);
cs

> 조명은 물체표면과의 입사각에 따라 빛의 강도도 달라진다. (빛은 직진한다.)

> OpenGL은 (광원의 각도) 계산을 단순화하기 위해 길이가 1인 법선벡터 사용.







기타. 참조자료


SoEn:소프트웨어 공학 연구소, OpenGL 강좌 소개

IT Land :: OpenGL 기초


OpenGL.org wiki


Unavailable :: OpenGL Rendering Pipeline

NeHe Productions: Masking

1 Blending Depth Test Depth Test Dithering Logical Operations Scissor Test Scissor Test Stencil Test Stencil Test Alpha Test Alpha Test Fragment Framebuffer. - ppt download






기타. 변경이력


일자

변경이력

2016-11-24

 초안

  1. SoEn:소프트웨어 공학 연구소, OpenGL 매뉴얼 http://www.soen.kr/lecture/library/opengl/opengl-10.htm [본문으로]
  2. DirectX9를 이용한 3D GAME 프로그래밍 입문, pp151-152. [본문으로]

'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

OpenGL ES: 기초 및 입문 (2)  (0) 2016.11.24
OpenGL ES: 기초 및 입문 (1)  (0) 2016.08.04
DX: 벡터와 행렬  (0) 2012.01.10
OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18


OpenGL ES: 기초 및 입문 (1)

OpenGL ES: 기초 및 입문 (2)

OpenGL ES: 기초 및 입문 (3)

OpenGL ES: 기초 및 입문 (4)

OpenGL ES: 기초 및 입문 (5)






0. 필요한 파일


크로스 플랫폼: Xamarin(자마린) 앱 개발 (1), 0. 필요한 파일 참조






1. 주요 특징


1) OpenGL ES?

> OpenGL for Embedded Systems, 모바일 임베디드 기기를 위해 제작한 3D Graphics API

> [PDF]모바일 그래픽스 분야 기술 동향 [#] [#html버전]

세상밖으로... :: Android OpenGL ES 사용에 앞서 알아두면 좋은것



2) OpenGL과의 차이점

OpenGL과 OpenGL ES의 차이점 | GAMOO ENTERTAINMENT


① 지원 타입의 수를 줄였다. 대표적으로 GLdouble 타입을 지원하지 않는데 사실 OpenGL에서도 이 타입은 잘 사용되지 않았다. 라이트 버전에는 GLfloat도 없고 고정 소수점 타입인 GLfixed 타입을 대신 사용한다. 임베디드 시스템에는 부동소수점 연산을 하드웨어가 수행하지 못하므로 소프트웨어로 느리게 수행해야 하기 때문이다. GLbyte, GLubyte, GLshort 타입도 제거되었다.

② 즉시 모드를 지원하지 않는다. glBegin~glEnd 블록안에서 그리기 함수를 호출할 수 없고 정점 배열만 사용할 수 있다. 함수 호출 오버헤드를 줄이기 위해서이다. 여러 정보를 한 배열에 저장하는 인터리브 배열도 지원하지 않는다.

③ 사각형을 그리는 glRect 함수가 제외되었다. 그래서 모든 물체를 삼각형으로만 구성해야 한다. GL_QUADS, GL_POLYGON 모델도 제외되었다. 사실 이 기능들은 OpenGL에서도 잘 사용되지 않는 것이다.

④ 색상 인덱스 모드는 지원하지 않는다. 조명이나 텍스처 맵핑 등에 제약이 많다. OpenGL에서도 팔레트 모드는 원래 제약이 많았다.

⑤ 그외 폴리곤 모드, 피드백, 선택 기능, 누적 버퍼, 출력 목록, 속성 저장 기능을 지원하지 않는다.

⑥ 텍스처 맵핑은 2D만 지원된다.

⑥ 조명은 앞뒷면이 반드시 동일해야 한다. 재질 모드는 GL_AMBIENT_AND_DIFFUSE만 지원된다.

-SoEn:소프트웨어 공학 연구소, OpenGL ES



3) 버전별 차이

버전

 주요 특징

 호환

 ES 1.0

 2003년 발표.

 고정 파이프라인

> 조명, 정점, 색, 카메라 설정시 내장된 함수 사용

 OpenGL 1.3

 주요 플랫폼

안드로이드: 1.6부터 지원 (API Level 4)

 ES 1.1

  OpenGL 1.5
 주요 플랫폼
Nintendo 3DS[각주:1]

 ES 2.0

 2007년 발표.

 GLSL 문법(OpenGL Shader Language)인 셰이더 가능

> toon shader등이 가능(?)

 All about OpenGL ES 2.x

 programmable pipeline

 OpenGL 2.0
 
주요 플랫폼
안드로이드 2.2부터 지원 (API Level 8)
iOS: 5부터 지원

 ES 3.0

 2012년 발표.

 기존 표준인 OpenGL ES 2.0과의 호환성을 보장하도록 설계(OpenGL ES 3.0 is backwards compatible with OpenGL ES 2.0)[각주:2]

 OpenGL 2.0

 주요 플랫폼

안드로이드: 4.3부터 지원(jellybean mr2)

iOS: 7부터 지원

 ES 3.1

 2014년 발표.

 주요 플랫폼

안드로이드: 5.0부터 지원

 ES 3.2

 2015년 발표.

 


> OpenGL ES 3.0(左)とOpenGL ES 2.0(右)の比較






기타. 변경이력


일자

변경이력

2016-08-04

 초안

  1. https://en.wikipedia.org/wiki/OpenGL_ES#OpenGL_ES_1.1_2 [본문으로]
  2. https://en.wikipedia.org/wiki/OpenGL_ES#OpenGL_ES_3.0 [본문으로]

'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

OpenGL ES: 기초 및 입문 (2)  (0) 2016.11.24
OpenGL ES: 기초 및 입문 (1)  (0) 2016.08.04
DX: 벡터와 행렬  (0) 2012.01.10
OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18
CPP, DX






1. 벡터
1) 벡터와 좌표계.
-> DirectX는 기본적으로 왼손 좌표계(Left-handed)로 엄지(z) = 화면속으로 / 검지(x)는 가로 / 중지(y)는 세로.

 벡터(Vector)

 스칼라

공간상, 길이와 방향
크기와 방향을 모두 나타냄.(방향 표식 용이)
위치고려X
단위벡터 : 벡터의 길이, 크기가 1인 벡터

 


typedef struct D3DVECTOR //3차원 벡터
{
    float x, y, z;
} D3DVECTOR, *LPD3DVECTOR;

typedef struct D3DXVECTOR3 : public D3DVECTOR
{
public:
    D3DXVECTOR3() {};
    ...
    ...  
} D3DXVECTOR3, *LPD3DXVECTOR3;



2) 벡터의 크기
|vector(x, y)| = (x2 + y2)^1/2
-> 선분의 길이.

 예시 코드. 벡터의 크기

FLOAT D3DXVec3Length
(
  CONST D3DXVECTOR3 * pV
);

D3DXVECTOR3 v(0,3,4);
float len = D3DXVec3Length( &v);




3) 벡터의 정규화
-> 벡터의 크기를 1로 만들어 단위벡터로 만드는것.

vector(x, y, z)
-> (x/vec_leng, y/vec_leng, z/vec_leng) = 정규화

 예시 코드. 벡터의 정규화

D3DXVECTOR3 * D3DXVec3Normalize
(
  D3DXVECTOR3 * pOut,
  CONST D3DXVECTOR3 * pV
);
D3DXVec3Normalize( &n, &v );




4) 벡터의 사칙연산

 ①벡터의 덧셈

 ②벡터의 뺄셈

 ③벡터의 곱셈&나눗셈


Va(x1, y1, z1) + Vb(x2, y2, z2)
= (x1+x2, y1+y2, z1+z2) 


Va(x1, y1, z1) - Vb(x2, y2, z2)
= (x1-x2, y1-y2, z1-z2) 

Va(x1, y1, z1) * N
=  (x1* N, y1* N, z1* N)
{N ≤ 0 or N ≥ 0,
 0 ≤ |N| ≤ 1} 




5) 벡터의 내적(Dot Product)

 공식

예시코드. 내적

u = (x1, y1, z1)
v = (x2, y2, z2)

u · v
= (x1*x2, y1*y2, z1*z2)

FLOAT D3DXVec3Dot
(
  CONST D3DXVECTOR3 * pV1,
  CONST D3DXVECTOR3 * pV2
);

D3DXVECTOR3 u(1,2,1);
D3DXVECTOR3 v(1,1,1);
float result = D3DXVec3Dot( &u, &v);




6) 벡터의 외적(Vector Cross)
-> 두 벡터가 있을때 두 벡터에 수직인 벡터를 구함.

 공식

예시코드. 외적

u = (x1, y1, z1)
v = (x2, y2, z2)

 u X v
= (y1*z2 - z1*y2,
   z1*x2 - x1*z2,
   x1*y2 - x2*y1)
 

* 계산에 대한 요령이라면,
 각 축당, 해당 축을 제외한 원소들로
2차원 역행렬처럼 계산하면됨. 

D3DXVECTOR3 * D3DXVec3Cross

(
  D3DXVECTOR3 * pOut,
  CONST D3DXVECTOR3 * pV1,
  CONST D3DXVECTOR3 * pV2
);

D3DXVECTOR3 u(1,2,1);
D3DXVECTOR3 v(1,1,1);
D3DXVECTOR3 result = D3DXVec3Cross( & result, &u, &v);





2. 행렬
1) 행과 열
행: 가로로 나열된 줄.
열: 세로로 나열된 줄.
-> 게임프로그래밍등에서 행렬을 사용하는 이유는 행렬의 곱셈이 그만큼 유용해서.

 예시코드. 행렬.

typedef struct _D3DMATRIX
{
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;
        };
        float m[4][4];
    };
} D3DMATRIX;

typedef struct D3DXMATRIX : public D3DMATRIX
{
public:
    D3DXMATRIX() {};
......
......  
} D3DXMATRIX, *LPD3DXMATRIX;




2) 항등행렬
EA = AE = E 
-> 임의의 행렬에 곱해도 그 자신의 행렬이 되게 하는 행렬
-> 대표적인 항등행렬은

1

0

0

2

이나

1

0

0

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

1


 예시코드. 항등 행렬.

BOOL D3DXMatrixIsIdentity
(
  CONST D3DXMATRIX * pM
);

D3DXMATRIX I; 
D3DXMatrixIsIdentity(&I);




3) 행렬의 곱셈
-> 원하는 공간상에 점 벡터를 행렬과 연산키 위해서는 4차원 행렬을 사용.
-> (X, Y, Z, W)을 보통은 ( X, Y, Z, 1)로도 표시.
① 이동 행렬

 공식

 예시 코드.

D3DXMATRIX * D3DXMATRIXTranslation
(
  D3DXMATRIX * pOut,
  FLOAT x,
  FLOAT y,
  FLOAT z
);


② 스케일 행렬

 공식

 예시 코드.

D3DXMATRIX * D3DXMATRIXScaling
(
  D3DXMATRIX * pOut,
  FLOAT sx,
  FLOAT sy,
  FLOAT sz
);


③ 회전행렬

D3DXMATRIX * D3DXMatrixRotationX
(
  D3DXMATRIX * pOut,
  FLOAT Angle
);


④ 행렬의 조합
 곱셈의 연산의 다수일때, 과부하가 되므로 행렬로 묶어서 다수의 연산을 하나로 줄이게 됨. 이렇게 되면, 각 항목에 적용되는 곱셉과 덧셈의 숫자를 효과적으로 절감.

 



참고자료.
DirectX2(2012.01.01 ~2012.01.31)

'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

OpenGL ES: 기초 및 입문 (2)  (0) 2016.11.24
OpenGL ES: 기초 및 입문 (1)  (0) 2016.08.04
DX: 벡터와 행렬  (0) 2012.01.10
OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18






1, 강좌



 메모

 Lectures on Game Programming

 한국어.
 비교적 간단하게 설명됨. 1회정도 정독후, 'Learn OpenGL'쪽 강좌를 보는걸 추천.

 Learn OpenGL

 영문.
 최근 openGL 강좌중

 가독성뿐아니라, 소분류/모식도/샘플코드외에도 색상박스등으로 읽는 사람을 배려한 레이아웃등이 세심하다.

 GIS DEVELOPER

 한국어.
 주로 파이프라인쪽 세부과정 튜토리얼 번역문[#]

 opengl. 위키

 영문.
 공식 위키.

 openGL의 모든 용어에 대한 설명과 연관함수도 명시하고 있어서 용어 확인에는 괜찮다. 


기타.
OpenGL® ES 3.x Tutorials //튜토리얼이라고 쓰여있지만 내용은 거의 이론 설명





2. API문서

버전

 

 1.x

 OpenGL 1.1 Reference: Table of Contents

 2.x

 OpenGL 2.1 Reference Pages
 3.x

 (4.3 버전업때 3.0과 완전히 호환되기때문에 4.x레퍼런스 페이지로 가도된다.[각주:1])

 4.x opengl42-quick-reference-card.pdf
 OpenGL 4.5 Reference Pages

기타. OpenGL ES
1) 버전별 튜토리얼


2) 복합
SongHo OpenGL tutorials  //구성상 큰 항목별로 이론설명&샘플코드
duriansoftware // 몇몇 구현에서는 OS 혹은 플랫폼별 차이도 설명하고 있다.
Lazy Foo' Productions - OpenGL Tutorials //파일별 샘플코드를 보기좋게 디스플레이 했지만 실행결과 캡쳐는 최소화.


3) 기타. OpenGL ES

GL Triangle 20 - Xamarin (OpenGL ES 2.0, C#)
GL Triangle 30 - Xamarin (OpenGL ES 3.0, C#)

OpenGL® ES 3.0 Programming Guide - Book Website (C/C++)


learnopengles.com (ES 2.0, *.JAVA)

Lesson One: Getting Started

Lesson Two: Ambient and Diffuse Lighting

Lesson Three: Moving to Per-Fragment Lighting

Lesson Four: Introducing Basic Texturing

Lesson Five: An Introduction to Blending

Lesson Six: An Introduction to Texture Filtering

Lesson Seven: An Introduction to Vertex Buffer Objects

Lesson Eight: An Introduction to Index Buffer Objects


A real Open GL ES 2.0 2D tutorial (*.JAVA)

part 1: Rendering a triangle

part 2: Rendering an Images

part 3: Handling Input

part 4: Transforming Images

part 5: Knowing the OpenGL texture system

part 6: Screens and dimensions

part 7: Texture Atlas

part 8: Rendering Text


OpenGL ES 2.0의 Shader Programming을 이용하여, MFC와 Android용 기초 강좌

> [#pdf]

> [#html버전]







일자

변경이력

2011-12-10

 초안

2016-11-24

 타이틀 변경

> 프로그래밍 가이드북 & 강좌  -> OpenGL: 강좌 및 튜토리얼 모음


  1. https://en.wikipedia.org/wiki/OpenGL#OpenGL_4.3 [본문으로]

'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

OpenGL ES: 기초 및 입문 (1)  (0) 2016.08.04
DX: 벡터와 행렬  (0) 2012.01.10
OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18
DX: 기초이론(1)  (0) 2011.10.18
  1. Favicon of https://chessdatabase.science/wiki/MS BlogIcon bkm2400 2020.11.20 00:17

    유용한 글 정말 잘 보고 가용~

  2. Favicon of https://quoras.trade/story.php?title=EFBBBFwordpress-EC9BB9-EC82ACEC9DB4ED8AB8.. BlogIcon futurewe 2020.11.26 02:50

    재미있는 글 매우 잘 배우고 가여

* 이 포스트는 메모용으로 차후에도 내용이 변경될수 있으므로, 링크스크랩만 허용합니다.



1. 기초지식
① 좌표계
② 점의 표현
③ 폴리곤
④ 버텍스, 라인 


2. Rendering Pipeline (모르면 개고생일만큼 중요)
① 가장 범용적인 파이프라인 형태
② DX에서의 파이프라인


3. 기하 변환
① 절차
② 변환
③ Back Face Culling (후면 선별)


4. 레스터 변환
① 가시성
② Depth buffer의 종류
③ Fogging


5. DX의 3D관련 메모리
* Shader에서 사용되는 메모리는 레지스터로 불림
① 화면 해상도 만큼 필요한 버퍼 메모리
② 프로그래밍 형식에 따라 가변되는 메모리(Resource라고 부름)
③ 반드시 Graphic Card에 존재해야 하는 메모리
④ 필요시 System Memory에서 복사되어 사용되는 메모리






'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

DX: 벡터와 행렬  (0) 2012.01.10
OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18
DX: 기초이론(1)  (0) 2011.10.18
DX: Direct3D 초기화 4단계  (0) 2011.10.17
  1. Favicon of https://lockedinmagazine.com/members/bowlchain0/activity/12307/ BlogIcon pxvixifvr3 2020.11.24 00:56

    유용한 글 매우 잘 배우고 가용~

* 이 포스트는 메모용으로 차후에도 내용이 변경될수 있으므로, 링크스크랩만 허용합니다.


1. DX 초기화
2. 그래픽 카드
3. 기타 초기화 & 게임프로그래밍 루프
4. Lost Device






'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18
DX: 기초이론(1)  (0) 2011.10.18
DX: Direct3D 초기화 4단계  (0) 2011.10.17
DX: 다이렉트X09_3D 튜토리얼 01~06  (0) 2011.10.17
* 이 포스트는 메모용으로 차후에도 내용이 변경될수 있으므로, 링크스크랩만 허용합니다.


0. 다이렉트 엑스(DirectX)란?

1. DirectX의 구조

2. DirectX9
① DX9부터 유명무실한 기능
② DX9에서도 사용되고 있는 기능

3. DirectX10

4. DirectX11






'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18
DX: 기초이론(1)  (0) 2011.10.18
DX: Direct3D 초기화 4단계  (0) 2011.10.17
DX: 다이렉트X09_3D 튜토리얼 01~06  (0) 2011.10.17
openGL과 DirectX의 좌표계 비교  (0) 2011.10.12
1. IDirect3D9인터페이스
2. D3DCAPS확인
3. 구조체 인스턴스 초기화
4. 객체생성.


 




1. IDirect3D9인터페이스

 -> DirectX Library의 설치 여부검사 및 장치 인터페이스 포인터 얻기(2가지)
① IDirect3D9 *D3D; //COM(컴포넌트 객체모델) 인터페이스는 대문자I로 시작.
② LPDIRECT3D9 D3D = NULL; // D3D 디바이스를생성할D3D객체변수
D3D = Direct3DCreate9( D3D_SDK_VERSION ); //①나 ②로 얻은 포인터등을 사용.




2. D3DCAPS확인

-> D3DCAPS9을 통한 장치 성능 확인. 일반 실습 과정에서는 생략 가능




3. 구조체 인스턴스 초기화

-> 화면 크기/동작 모드 등 설정. D3DPRESENT_PARAMETERS 구조체의 값 설정
-> 필수적인 그래픽 카드 기본설정인 멤버변수는 굵은글씨다.

 




4. 객체생성.

-> D3DPRESENT_PARAMETERS를 통한 IDirect3DDevice9 객체 생성
① IDirect3DDevice9 *Device = 0; //COM(컴포넌트 객체모델) 인터페이스는 대문자I로 시작.
② LPDIRECT3DDEVICE9 Device = NULL; // 렌더링에사용될D3D디바이스


'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

DX: 기초이론(2)  (0) 2011.10.18
DX: 기초이론(1)  (0) 2011.10.18
DX: Direct3D 초기화 4단계  (0) 2011.10.17
DX: 다이렉트X09_3D 튜토리얼 01~06  (0) 2011.10.17
openGL과 DirectX의 좌표계 비교  (0) 2011.10.12
VS2010 & DX 기본설정  (1) 2011.10.12
* 각 소스마다 주석으로 소스내 구조흐름과 노트정리를 해두었습니다.
* 튜토리얼 3부터는 자체적으로 변형한것들입니다.





Tutorial 00: 다이렉트X 도큐먼트

 C:\Program Files\Microsoft DirectX SDK (August 2009)\Documentation\DirectX9\directx_sdk.chm 을 실행해서 참고하는것도 좋습니다.





Tutorial 01: CreateDevice






Tutorial 02: Vertices


 버텍스 포맷 종류
->동명이형인 포맷중 택1
->위치, 색상, 텍스쳐좌표등 

dwFVF = ( D3DFVF_XYZ | D3DFVF_DIFFUSE );
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE );
dwFVF = ( D3DFVF_XYZ | D3DFVF_TEX2 );
dwFVF = ( D3DFVF_XYZRHW | D3DFVF_TEX2 );
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE
                                                                | D3DFVF_SPECULAR | D3DFVF_TEX2 );

 변환된 버텍스
->예. 성분 수동입력 

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw;
    //FLOAT x, y, z;
    DWORD color;        // DWORD로 색깔표현가능. 16진수 사용.
                                //RGB조합[0xargb]으로 각 원소는 0~255[256].
};

 버텍스 포맷 세팅.

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

그리기 방법 인자
-> 멤버중 택1해서 사용.

typedef enum _D3DPRIMITIVETYPE
{
    D3DPT_POINTLIST         = 1,
    D3DPT_LINELIST           = 2, //독립된 라인들
    D3DPT_LINESTRIP         = 3, //연결된 라인들
    D3DPT_TRIANGLELIST   = 4, //독립된 삼각형들. 버텍스정보 기준으로 맞닿는 변이 없다.
    D3DPT_TRIANGLESTRIP = 5,
    D3DPT_TRIANGLEFAN    = 6, //면을 폴리곤들의 집함으로 표현.
                                       //오로지 하나의 버텍스가 공통점.
    D3DPT_FORCE_DWORD   = 0x7fffffff,
} D3DPRIMITIVETYPE;

정점들에 대한 입력.

버텍스 버퍼
-> 버퍼를 비디오 메모리에
저장 가능.
-> 배열보다 빠른 작업 

D3DFVF_CUSTOMVERTEX,0,CUSTOMVERTEX Tutorial2[] =
{
      { 200.0f, 10.0f,  0.5f, 1.0f, 0xfff00000, }, // x→, y↓, z, rhw, color
      { 325.0f, 250.0f, 0.5f, 1.0f, 0x002ff200, },
      { 75.0f, 250.0f, 0.5f, 1.0f, 0x00002fff, }
  // { 100.0f, 10.0f, 0.5f, 0xfff00000, }, // x→, y↓, z, rhw, color
  // { 325.0f, 250.0f, 0.5f, 0x002ff200, },
  // { 75.0f, 250.0f, 0.5f, 0x00002fff, }
};//삼각형 그리는 구조체.

//버텍스 버퍼만들기
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3 * sizeof( CUSTOMVERTEX ),
                                                                    0,
                                                                    D3DFVF_CUSTOMVERTEX,
                                                                    D3DPOOL_DEFAULT,//버퍼가 만들어지는 장소
                                                                    &g_pVB,//버텍스 버퍼가 포인터에 저장
                                                                    NULL // 언제나 NULL
  )))
{
       return E_FAIL;
}

VOID* pTutorial2;

//버텍스 구조체에 넣은 값을 버텍스 버퍼로 옮기기.
//메모리 주소를 얻어와서 집어넣음.
if( FAILED( g_pVB->Lock( 0,   //잠금을 시작할 버퍼위치의 오프셋값
                               sizeof( Tutorial2 ),     //잠글 바이트 수
                               ( void** )&pTutorial2, //잠근 메모리의 포인터
                               0    //잠금이 이루어질 방법
                             ))) //버텍스 버퍼 메모리 포인터 획득.
     return E_FAIL;

memcpy( pTutorial2, Tutorial2, sizeof( Tutorial2 ) );
               //포인터에 버텍스 버퍼값 복사해 넣기
g_pVB->Unlock(); // 잠갔던 메모리 해제

SetStreamSource
->  버텍스 버퍼를
     N번 데이터 스트림에
     연결.

DrawPrimitive 
-> 버텍스 내용 그리는 함수

g_pd3dDevice->Clear( 0,
                                 NULL, //표면의 특정영역만을 소거할수 있도록 해준다.
                                 D3DCLEAR_TARGET, //랜더대상 표면(보통은 후면버퍼)
                                 D3DCOLOR_XRGB( rgb_r, rgb_g, rgb_b ),
                                 1.0f, //Z버퍼
                                 0    //스텐실버퍼
                               );

// (Drawing)
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
     g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, // 그리기 방식 인자
                                             0,
                                             1 //그려질 라인이나 삼각형등의 갯수.
                                           );


     // End the scene
     g_pd3dDevice->EndScene(); //백버퍼에서의 랜더링 마무리.
}

//Device->Present
g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); //랜더링된 결과를 보임.







Tutorial 03: Matrices

-> 현재 포스팅한 소스는 기존 예제에서 버텍스버퍼를 활용한 2개의 매트릭스를 월드변환한 좌표에 넣었다.
-> D3DX 라이브러리에서 제공하는 기본매쉬중 육면체를 추가해서 그려넣었다.
          (참고1 : 용책 3장.)
          (참고2 : DirectX를 이용한 3차원 그래픽 프로그래밍 기초)
          (참고 : 게임코디, 월드변환에 대해.)






Tutorial 4: Lights


조명.
Diffuse : 난반사광의 양 조절.
Ambient : 환경광의 양 조절.
Specular : 정반사광의 양 조절.
Emissive : 전반적인 표면의 컬러. 물체 자체의 색상지정.
Power : 정반사광 강도 조절. 높은 값일수록 하이라이트 강조.

 typedef struct _D3DLIGHT9
{
    D3DLIGHTTYPE    Type;
    D3DCOLORVALUE   Diffuse;         /* Diffuse color of light */
    D3DCOLORVALUE   Specular;        /* Specular color of light */
    D3DCOLORVALUE   Ambient;         /* Ambient color of light */
    D3DVECTOR       Position;         /* Position in world space */
    D3DVECTOR       Direction;        /* Direction in world space */
    float           Range;
    float           Falloff;
    float           Attenuation0;     /* Constant attenuation */
    float           Attenuation1;     /* Linear attenuation */
    float           Attenuation2;     /* Quadratic attenuation */
    float           Theta;            /* Inner angle of spotlight cone */
    float           Phi;              /* Outer angle of spotlight cone */
} D3DLIGHT9;

광원.
① 점 광원(point light): 월드 스페이스내 존재. 광원에서 모든방향으로 빛을 방산.
-> 위치값O, 방향성X [백열전구]
-> Position, Range, Attenuation
② 방향성 광원(directional light): 빛의 진행방향으로 평행하게 발산.
-> 특정한 색상. 위치값X. 방향성O [태양]
-> Direction, 
③ 스포트 광원(spot light): 무대의 조명이나 손전등처럼 빛이 월뿔형으로 발산. 광원의 법선에 근접할수로 밝음.
-> 특정한 색상. 위치값O, 방향성O
-> Position, Direction, Range, Falloff(보통 1.0), Attenuation, Theta(원뿔의 내부각쯤?), Phi


표면, 면 법선(face normal)

표면, 버텍스 법선(vertex normal)

 [이미지 출처, 바로가기]






Tutorial 05: Textures







Tutorial 06: Meshes







1

2

3

1

2

3


 

 

 



+X = 엄지 / +Y = 검지 / +Z = 중지



왼손좌표계 : 모니터를 기준으로 안쪽으로 +Z



오른손좌표계 : 모니터 기준으로 화면바깥이 +Z

+ Recent posts