Japanese | English | Korean

Samples


렌더링 할 수 있는 primitive는 아래와 같습니다.

Primitive 설명
1 픽셀로 렌더링 되는 점.
Primitive 단위로 색을 지정 가능.
브랜드 처리방법(브랜드 없음, 반투명, 가산, 감산)을 속성으로 선택할 수 있다.
라인 두 점을 직선으로 묶은 폭 1픽셀의 라인.
Primitive 단위로 색을 지정 할 수 있다.
브랜드 처리방법을 속성으로 선택 할 수 있다.
삼각 폴리곤 세 점을 지정하는 것으로 렌더링 되는 삼각 폴리곤.
컬러 폴리곤인지 texture 폴리곤인지, 정점 단위의 법선인지 Primitive 단위의 법선인지, 브랜드 처리방법, 광원 처리를 가하는지, Sphere map을 시행하는지, 라고 하는 폴리곤 속성을 선택할 수 있다.
사각 폴리곤 네 점을 지정하는 것으로 렌더링 되는 사각 폴리곤.
선택할 수 있는 폴리곤 속성은 삼각 다각형과 같음.
포인트 스프라이트 표시 좌표를 지정하여 항상 시점 방향을 향한 사각 폴리곤을 렌더링 한다.
브랜드 처리방법을 지정할 수 있다.

이러한 primitive의 렌더링 방법은 MascotCapsule V3 에서는 아래의 3 종류의 방법이 있습니다.

  1. OEMC_Micro3D_Render_drawPrimitive( Render* This, hi_sint32 primtype, IntArray* coord, IntArray* normal, IntArray* texcoord, IntArray* color ) 를 사용해 한종류의 Prymitive를 복수개 일괄로 렌더링 하는 방법.
  2. OEMC_Micro3D_Render_drawCommandList( Render* This, IntArray* array ) )를 사용해 복수 종류의 Primitive를 일괄로 렌더링 하는 방법.
  3. OEMC_Micro3D_bgeinPrimitive( Render* This, hi_sint32 primtype ) 로부터 시작되어, OEMC_Micro3D_endPrimitive( Render* This )로 종료하는 1 Primitive씩 지정하는 방법.

이러한 방법 가운데 3의 방법은 함수 호출이 장황하게 되기 때문에 추천해 드리지 않겠습니다. 통상은 1의 방법 혹은 커멘드 리스트에 저항이 없으면 2를 추천 합니다.
여기에서는 1의 방법 OEMC_Micro3D_Render_drawPrimitive()를 사용한 Primitive의 렌더링 방법에 대해 설명합니다.

 
표면 화면:이면



1.각종 Primitive

여기에서는 MascotCapsule V3로 렌더링 할 수 있는 Primitive에 대해 설명합니다.

1.1. 점

삼차원 좌표를 지정해 점을 렌더링 합니다. 렌더링 되는 점은 스크린의 설정에 따르지 않고, 1 픽셀로 표현됩니다. 점을 렌더링 할 때에는 아래의 파라미터가 필요합니다.

  • 점을 렌더링 하는 삼차원 좌표(모델 좌표계 )
  • 점의 색
  • 점의 속성과 데이터 타입

1.2. 라인

삼차원 좌표로 나타나는 2개의 점 사이을 묶는 라인을 렌더링 합니다. 렌더링 되는 라인의 폭은 스크린의 설정에 의하지 않고, 1 픽셀로 표현됩니다.
라인을 렌더링 할 때에는 아래의 파라미터가 필요합니다.

  • 라인 양단의 삼차원 좌표(모델 자표계) )
  • 라인의 색
  • 라인의 속성과 데이터 타입

1.3. 삼각 폴리곤

삼차원 좌표로 나타나는 세 점으로 구성되는 삼각 폴리곤을 렌더링 합니다. 삼각 폴리곤에는 texture를 붙이는 texture 폴리곤과 색을 지정하여 단색으로 렌더링 되는 컬러 폴리곤이 있습니다.
삼각 폴리곤을 렌더링 할 때에는 이하의 파라미터가 필요합니다.

  • 삼각 폴리곤을 구성하는 세 점의 삼차원 좌표(모델 자표계)
  • 삼각 폴리곤의 법선
  • 삼각 폴리곤에 붙이는 texture 좌표(texture 폴리곤의 경우 )
  • 삼각 폴리곤의 색(컬러 폴리곤의 경우)
  • 삼각 폴리곤의 속성과 데이터 타입

1.4. 사각 폴리곤

삼차원 좌표로 나타나는 네 점으로 구성되는 사각 폴리곤을 렌더링 합니다. 삼각 폴리곤과 같이, 사각 폴리곤도 texture 폴리곤과 컬러 폴리곤이 있습니다.
사각 폴리곤을 렌더링 할 때에는 아래의 파라미터가 필요합니다.

  • 사각 폴리곤을 구성하는 네 점의 삼차원 좌표(모델 좌표계)
  • 사각 폴리곤의 법선
  • 사각 폴리곤에 붙이는 texture 좌표(texture 폴리곤의 경우)
  • 사각 폴리곤의 색(컬러 폴리곤의 경우)
  • 사각 폴리곤의 속성과 데이터 타입

1.5. 포인트 스프라이트

삼차원 좌표로 나타나는 한 점을 중심으로 한, 시점에 대해 항상 정면을 향하는 사각 폴리곤을 렌더링 합니다.
포인트 스프라이트를 렌더링 할 때에는 아래의 파라미터가 필요합니다.

  • 포인트 스프라이트의 표시 위치를 나타내는 하나의 삼차원 좌표(모델 좌표계)
  • 포인트 스프라이트에 붙이는 texture 좌표
  • 포인트 스프라이트의 사이즈와 앵글
  • 포인트 스프라이트의 표시 플래그
  • 포인트 스프라이트의 속성과 데이터 타입

또한 MascotCapsule V3 에 있어서의 포인트 스프라이트는 표시 할 때, 아래의 플래그를 지정하여 표시 방법을 결정합니다.

플래그 설명
M3DPSF_LOCAL_SIZE 모델 좌표계에 있어서의 사이즈를 지정합니다.
M3DPSF_PIXEL_SIZE 스크린 좌표계에 있어서의 사이즈를 지정합니다.
M3DPSF_PERSPECTIVE 투시투영에 대해 퍼스펙티브를 유효하게 합니다.
M3DPSF_NO_PERS 투시투영에 대해 퍼스펙티브를 무효하게 합니다.

이러한 플래그를 논리 고리로, 표시 방식으로서 지정합니다.
다만, M3DPSF_LOCAL_SIZE와 M3DPSF_PIXEL_SIZE, 및 M3DPSF_PERSPECTIVE와 M3DPSF_NO_PERS는 각각 배타적인 관계에 있습니다.




2. Primitive 렌더링

여기에서는 앞에서 말한 대로 OEMC_Micro3D_Render_drawPrimitive()를 이용한 Primitive의 렌더링에 대해 설명합니다. OEMC_Micro3D_Render_drawPrimitive()를 사용함으로써 복수의 Primitive를 한 번에 렌더링 설정할 수 있게 됩니다. 이 때 한 번에 설정할 수 있는 것은 같은 속성을 가진 같은 Primitive뿐입니다. 다른 Primitive, 혹은 같은 Primitive라도 다른 속성을 가지는 경우에는 따로 렌더링 설정을 할 필요가 있습니다.

(예) 같은 Primitive에서 다른 속성을 가진 경우
       법선을 Primitive 단위로 가진 삼각 폴리곤과 정점 단위로 가진 삼각 폴리곤 등


OEMC_Micro3D_Render_drawPrimitive()는 인수로서 Render 오브젝트의 포인트 이외에 아래의 것을 지정할 필요가 있습니다.

  • Primitive의 종류와 속성 및 수
  • Primitive를 렌더링 할 때에 사용하는 정점 배열
  • Primitive를 렌더링 할 때에 사용하는 법선 배열
  • Primitive를 렌더링 할 때에 사용하는 texture 위치 정보 배열
  • Primitive를 렌더링 할 때에 사용하는 색 정보 배열

이하, 각 인수의 설명을 합니다.

2.1. Primitive의 종류, 속성, 데이터 타입 및 수

이러한 인수의 지정방법은 아래와 같습니다.

Primitive의 종류   |  Primitive의 속성  |  Primitive의 데이터 타입   |  (Primitive의 수 << 16 )

라고 하는 것처럼 각 항목의 논리화을 지정합니다.

/**
  * 삼각 폴리곤용 구조체
  * typedef struct tag_Triangle{
  *         IntArray coord;       /* 정점 정보 배열 */
  *         IntArray normal;     /* 법선 정보 배열 */
  *         IntArray color;      / * 색 정보 배열 */
  * }Triangle;
*/

/* 삼각 폴리곤 */
OEMC_Micro3D_Render_drawPrimitive( &render,
M3DP_TRIANGLES | M3DPD_TEXCOORD_NONE |
M3DPD_NORMAL_PER_FACE | M3DPD_COLOR_PER_FACE |
M3D_BLEND_NORM | M3D_LIGHTING | ( 2 << 16 ),
&triangle.coord, &triangle.normal, NULL, &triangle.color );

Primitive의 개수는 16 bit왼쪽 시프트 할 필요가 있는 것에 주의해 주세요. OEMC_Micro3D_Render_drawPrimitive()로 한 번에 설정할 수 있는 Primitive의 개수는 최대 255개입니다. 또한, 속성 및 데이터 타입에 관해서는 필요한 것을 연속해서 기술할 수 있습니다.



Primitive의 종류는 아래의 선언으로부터 지정합니다.

Primitive 선언
M3DP_POINTS
라인 M3DP_LINES
삼각 폴리곤 M3DP_TRIANGLES
사각 폴리곤 M3DP_QUADS
포인트 스프라이트 M3DP_POINT_SPRITES

Primitive의 지정은 1회의 함수 호출에 대해 반드시 하나 뿐입니다.



속성에 관해서는 아래의 선언 중에서 지정합니다.

선언 설명
M3D_LIGHTING Primitive는 광원 처리의 대상이 됩니다.
점, 라인, 포인트 스프라이트에서는 무효입니다.
M3D_SPECULAR Primitive는 Sphere map처리의 대상이 됩니다.
점, 라인, 포인트 스프라이트에서는 무효입니다.
M3D_COLORKEY Primitive는 컬러 키에 의한 투과 처리의 대상이 됩니다. 점, 라인에서는 무효입니다.
M3D_BLEND_NORM 브랜드 처리를 하지 않습니다.
M3D_BLEND_HALF 반투명처리를 합니다.
M3D_BLEND_ADD 가산처리를 합니다.
M3D_BLEND_SUB 감산처리를 합니다.

속성의 설정은 필요한 것을 논리화로 추가해 주세요. 다만, Primitive에 따라서는 받아들이지 않는 속성도 있습니다. 또한, 광원, Sphere map, 컬러 키, 블랜드 처리 등에 대해서는 각각 상세한 매뉴얼을 참조해 주세요.



데이터 타입에 관해서는 아래의 선언으로부터 지정합니다.

선언 설명
M3DPD_NORAML_PER_FACE Primitive 단위로 법선을 가집니다.
점, 라인, 포인트 스프라이트에서는 무효입니다.
M3DPD_NORMAL_PER_VERTEX 정점 단위로 법선을 가집니다.
점, 라인, 포인트 스프라이트에서는 무효입니다.
M3DPD_COLOR_PER_FACE Primitive 단위로 색 정보를 가집니다.
포인트 스프라이트에서는 무효입니다.
점, 라인에서는 반드지 지정해 주세요.
M3DPD_TEXCOORD Texture 위치 정보를 가집니다.
점, 라인은 무효입니다.
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE 포인트 스프라이트의 texture 위치 정보를 가집니다.
포인트 스프라이트에서만 유효합니다.
포인트 스프라이트에서는 이것이나
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX 를 반드시 지정해 주세요. (* )
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX 포인트 스프라이트의 texture 위치 정보를 가집니다.
포인트 스프라이트에서만 유효합니다.
포인트 스프라이트에서는 이것이나
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE 를 반드시 지정해 주세요. (* )
M3DPD_NORMAL_NONE 법선 정보를 가지지 않습니다.
M3DPD_COLOR_NONE 색 정보를 가지지 않습니다.
M3DPD_TEXCOORD_NONE texture 위치 정보를 가지지 않습니다.

(* ) M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE와 M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX 는 같은 처리가 됩니다. 양쪽의 다른 것은 선언뿐입니다.


데이터 타입의 설정도 속성 등과 같이 필요한 것을 논리화로 추가 기술하여 사용해 주세요. Primitive로 따라서는 받아들이지 않는 데이터 타입, 또는 필수의 데이터 타입이 있습니다.




2.2. 정점배열

정점 배열의 지정에는 IntArray를 사용합니다.
Primitive의 종류에 의해서 필요한 정점수는 다르기 때문에, 적절한 수의 정점을 설정해 주세요.

/**
  * 정수 배열용 컨테이너
  * typedef struct tagIntArray {
  *       hi_sint32 num;
  *       hi_sint32* array;
  * } IntArray;
*/


/* 정점 정보 배열 */
static const hi_sint32 _coord_array[] = {
0, 500, 0, -256, 0, 0, 256, 0, 0, /* 1 */
0, -500, 0, -256, 0, 0, 256, 0, 0, /* 2 */
};

/* 각 정보 배열용 컨테이너 */
const IntArray triangle_coord = { sizeof( _coord_array ) /
sizeof( _coord_array[0] ), _coord_array };


/**
* Primitive 초기화
*/
triangle.coord = triangle_coord;
Primitive 필요한 정점 수
Primitive수 x 1
라인 Primitive수 x 2
삼각 폴리곤 Primitive수 x 3
사각 폴리곤 Primitive수 x 4
포인트 스프라이트 Primitive수 x 1

실제로는 각 정점은(x, y, z)의 세 요소로부터 성립되기 때문에, 배열 그 자체의 크기는 정점수 x 3이 됩니다. 정점의 세 요소의 격납 순서는 x, y, z의 순서입니다.




2.3. 법선 배열

법선 배열의 지정에는 IntArray를 사용합니다. Primitive의 종류 및 데이터 타입에 따라 필요한 법선 수는 다르기 때문에 적절한 수의 법선을 설정해 주세요.

/* 법선 정보 배열 */
static const hi_sint32 _normal_array[] = {
0, 0, -4096, /* 1 */
0, 0, -4096, /* 2 */
};

/* 각 정보 배열용 콘테이너 */
const IntArray triangle_normal = { sizeof( _normal_array ) /
sizeof( _normal_array[0] ), _normal_array };


/**
  * Primitive 초기화
  */
triangle.normal = triangle_normal;
Primitive 데이터 타입 필요한 법선 수
- - - 0
라인 - - - 0
삼각 폴리곤 M3DPD_NORMAL_PER_FACE Primitive수 x 1
M3DPD_NORMAL_PER_VERTEX Primitive수 x 3
사각폴린곤 M3DPD_NORMAL_PER_FACE Primitive수 x 1
M3DPD_NORMAL_PER_VERTEX Primitive수 x 4
포인트 스프라이트 - - - 0

실제로는 각 법선은(x, y, z)의 세가지 요소로부터 성립되기 때문에, 배열 그 자체의 크기는 법선수 x 3이 됩니다. 법선의 세 요소의 격납순서는 x, y, z의 순서입니다.




2.4. texture 위치 정보 배열

texture 위치 정보 배열의 지정에는 IntArray를 사용합니다. Primitive의 종류 및 데이터 타입에 의해서 필요한 texture 위치 정보의 수는 다르기 때문에 적절한 수의 texture 위치 정보를 설정해 주세요.

/**
  * 사각 폴리곤용 구조체
  * typedef struct tag_Quad{
  *       IntArray coord;       /* 정점 정보 배열 */
  *       IntArray color;       /* 색 정보 배열 */
  *       IntArray texcoord; /* texture 위치 정보 배열 */
  * }Quad;
  */

/* texture 위치 정보 배열 */
static const hi_sint32 _texcoord_array[] = {
255, 255, 0, 255, 0, 0, 255, 0,
};

/* 각 정보배열용 콘테이너 */
const IntArray quad_texcoord = { sizeof( _texcoord_array ) /
sizeof( _texcoord_array[0] ), _texcoord_array };

/**
  * Primitive 초기화
  */
quad.texcoord = quad_texcoord;

Primitive 데이터 타입 필요한 texture 위치 정보의 수
- - - 0
라인 - - - 0
삼각 폴리곤 M3DPD_COLOR_PER_FACE 0
M3DPD_TEXCOORD Primitive수 x 3
사각 폴리곤 M3DPD_COLOR_PER_FACE 0
M3DPD_TEXCOORD Primitive수 x 4
포인트 스프라이트 - - - Primitive수 x 1(** )

삼각 폴리곤 및 사각 폴리곤의 정점 정보는 texture상의 2차원 좌표(x, y)이기 때문에, 배열 그 자체의 크기는 texture 위치 정보의 수 x 2가 됩니다. 또한 삼각 폴리곤 및 사각 폴리곤의 정점 정보로 설정된 좌표와 texture 위치 정보로 설정된 좌표는 설정된 차례에 응하여 대응하게 됩니다.

(** ) 포인트 스프라이트의 경우, 포인트 스프라이트의 각 파라미터도 여기에 포함됩니다.
포인트 스프라이트에 필요한 파라미터는,

  • 포인트 스프라이트의 폭
  • 포인트 스프라이트의 높이
  • 포인트 스프라이트의 앵글(360º = 4096)
  • 포인트 스프라이트의 좌상에 상응하는 texture 위치 정보 (x, y)
  • 포인트 스프라이트의 우하에 상응하는 texture 위치 정보 (x, y)
  • 포인트 스프라이트의 표시 플러그

이상의 것이 있어, 배열 그 자체의 크기는 원시적수 x 8이 됩니다.




2.5. 색 정보 배열

색 정보 배열의 지정에는 IntArray를 사용합니다. Primitive의 종류 및 데이터 타입에 따라 필요한 법선 수는 다르기 때문에 적절한 수의 색 정보를 설정해 주세요.

/* 색 정보 배열 */
static const hi_sint32 _color_array[] = {
0 << 16 | 255 << 8 | 0, /* 1 */
255 << 16 | 0 << 8 | 128, /* 2 */
};

/* 각 정보 배열용 콘테이너 */
const IntArray triangle_color = { sizeof( _color_array ) / sizeof( _color_array[0] ), _color_array };
/**
 * Primitive 초기화
 */
triangle.color = triangle_color;

Primitive 데이터 타입 필요한 색 정보의 수
- - - Primitive수 x 1
라인 - - - Primitive수 x 1
삼각 폴리곤 M3DPD_COLOR_PER_FACE Primitive수 x 1
M3DPD_TEXCOORD 0
사각 폴리곤 M3DPD_COLOR_PER_FACE Primitive수 x 1
M3DPD_TEXCOORD 0
포인트 스프라이트 - - - 0

색 정보는 RGB로 각 요소가 8bit의 24bit 형식에서 지정합니다. 이것은 실제 환경의 픽셀 정보로 좌우되는 일이 없습니다.

( R 요소 << 16 ) | ( G << 8 ) | ( B )

따라서 배열 그 자체의 크기는 필요한 색 정보의 수 x 1이 됩니다.





3. Primitive 렌더링의 샘플 코드

여기에서는 샘플 코드 내의 Primitive 렌더링에 관한 부분에 대해 설명합니다. 여기에서는 1. 2.에서 사용한 삼각 폴리곤의 렌더링을 예를 들어 설명합니다.
우선, Primitive 용의 변수를 아래와 같이 준비합니다.

/**
  * 정수 배열용 컨테이너
  * typedef struct tagIntArray {
  *       hi_sint32 num;
  *       hi_sint32* array;
  * } IntArray;
  *
  * 삼각 폴리곤용 구조체
  * typedef struct tag_Triangle{
  *       IntArray coord;
  *       IntArray normal;
  *       IntArray color;
  * }Triangle;
 */

/* 정점 정보 배열 */
static const hi_sint32 _coord_array[] = {
0, 500, 0, -256, 0, 0, 256, 0, 0, /* 1 */
0, -500, 0, -256, 0, 0, 256, 0, 0, /* 2 */
};

/* 법선 정보 배열 */
static const hi_sint32 _normal_array[] = {
0, 0, -4096, /* 1 */
0, 0, -4096, /* 2 */
};

/* 색 정보 배열 */
static const hi_sint32 _color_array[] = {
0 << 16 | 255 << 8 | 0, /* 1 */
255 << 16 | 0 << 8 | 128, /* 2 */
};

/* 각 정보 배열용 콘테이너 */
const IntArray triangle_coord = { sizeof( _coord_array ) / sizeof( _coord_array[0] ), _coord_array };
const IntArray triangle_normal = { sizeof( _normal_array ) / sizeof( _normal_array[0] ), _normal_array };
const IntArray triangle_color = { sizeof( _color_array ) / sizeof( _color_array[0] ), _color_array };


/**
  * Primitive 초기화
*/

triangle.coord = triangle_coord;
triangle.normal = triangle_normal;
triangle.color = triangle_color;


렌더링 처리를 위해 Render 오브젝트에의 설정을 실시합니다.

/* 정점 변환 행렬 설정 */
OEMC_Micro3D_Atrans3i_multiply2( &vtrans, &view_trans, &vtrans );
OEMC_Micro3D_Render_setViewTrans( &render, &vtrans );

/* 삼각 폴리곤 */
OEMC_Micro3D_Render_drawPrimitive( &render,
M3DP_TRIANGLES | M3DPD_TEXCOORD_NONE |
M3DPD_NORMAL_PER_FACE | M3DPD_COLOR_PER_FACE |
M3D_BLEND_NORM | M3D_LIGHTING | ( 2 << 16 ),
&triangle.coord, &triangle.normal, NULL, &triangle.color );

/* VRAM에 전송 */
OEMC_Micro3D_Render_flush( &render );


다른 Primitive도 같이 설정합니다.

라인

/**
  * 라인용 구조체
  * typedef struct tag_Line{
  *       IntArray coord;
  *       IntArray color;
  * }Line;
 */

/* 정점 정보 배열 */
static const hi_sint32 _coord_array[] = {
640, 1024, 0, 640, -1024, 0,
};

/* 색 정보 배열 */
static const hi_sint32 _color_array[] = {
255 << 16 | 0 << 8 | 0,
};

/* 각 정보 배열용 콘테이너 */
const IntArray line_coord = { sizeof( _coord_array ) / sizeof( _coord_array[0] ), _coord_array };
const IntArray line_color = { sizeof( _color_array ) / sizeof( _color_array[0] ), _color_array };

/**
 * Primitive 초기화
 */
line.coord = line_coord;
line.color = line_color;

/**
 * Render로의 설정
 */

/* 정점 변환 행렬 설정 */
OEMC_Micro3D_Atrans3i_multiply2( &vtrans, &view_trans, &vtrans );
OEMC_Micro3D_Render_setViewTrans( &render, &vtrans );

/* 라인 */
OEMC_Micro3D_Render_drawPrimitive( &render,
M3DP_LINES | M3DPD_NORMAL_NONE | M3DPD_TEXCOORD_NONE |
M3DPD_COLOR_PER_FACE | M3D_BLEND_NORM | ( 1 << 16 ),
&line.coord, NULL, NULL, &line.color );

/* VRAM에 전송 */
OEMC_Micro3D_Render_flush( &render );


포인트 스프라이트

/**
  * 바이트 데이터용 구조체
  * typedef struct tagByteData
  * {
  *       const hi_byte* addr;
  *       hi_uint32 size;
  * } ByteData;
  *
  * 포인트 스프라이트용 구조체
  * typedef struct tag_Sprite{
  *       IntArray coord;
  *       IntArray texcoord;
  *       Texture tex;
  * }Sprite;
 */

/* 정점 정보 배열 */
static const hi_sint32 _coord_array[] = {
-1024, 512, 0,
};

/* texture 위치 정보 배열 */
static const hi_sint32 _texcoord_array[] = {
1024, 1024, 0, 0, 0, 255, 255, M3DPSF_LOCAL_SIZE | M3DPSF_PERSPECTIVE,
};

/* 비트맵 데이터 */
static const hi_byte _sprite_bmp[] = {
0x42, 0x4d, 0x36, 0x4, 0x1, 0x0, 0x0, 0x0,
* * * (중략 ) * * *
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};

/* 각 정보 배열용 콘테이너 */
const ByteData sprite_bmp = { _sprite_bmp, sizeof( _sprite_bmp ) } ;
const IntArray sprite_coord = { sizeof( _coord_array ) / sizeof( _coord_array[0] ), _coord_array };
const IntArray sprite_texcoord = { sizeof( _texcoord_array ) / sizeof( _texcoord_array[0] ), _texcoord_array };


/**
 * Primitive 초기화
 */
sprite.coord = sprite_coord;
sprite.color = sprite_color;
sprite.texcoord = sprite_texcoord;

/**
 * Render로의 설정
 */
/* Texture를 설정 */
OEMC_Micro3D_Render_setTexture( &render, &sprite.tex );

/* 정점 변환 행렬 설정 */
OEMC_Micro3D_Atrans3i_multiply2( &vtrans, &view_trans, &vtrans );
OEMC_Micro3D_Render_setViewTrans( &render, &vtrans );

/* 포인트 스프라이트 */
OEMC_Micro3D_Render_drawPrimitive( &render,
M3DP_POINT_SPRITES | M3DPD_NORMAL_NONE |
M3DPD_COLOR_NONE | M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE |
M3D_BLEND_NORM | ( 1 << 16 ), &sprite.coord, NULL, &sprite.texcoord, NULL );

/* VRAM에 전송 */
OEMC_Micro3D_Render_flush( &render );


사각 폴리곤 ( *texture 데이터는 포인트 스프라이트와 공유하고 있습니다.)

/**
  * 사각 폴리곤용 구조체
  * typedef struct tag_Quad{
  *       IntArray coord;
  *       IntArray color;
  *       IntArray texcoord;
  * }Quad;
 */

/* 정점 정보 배열 */
static const hi_sint32 _coord_array[] = {
-512, 0, 0, -1536, 0, 0, -1536, -1024, 0, -512, -1024, 0,
};

/* 법선 정보 배열 */
static const hi_sint32 _normal_array[] = {
0, 0, -4096,
};

/* texture 위치 정보 배열 */
static const hi_sint32 _texcoord_array[] = {
255, 255, 0, 255, 0, 0, 255, 0,
};

/* 각 정보 배열용 콘테이너 */
const IntArray quad_coord = { sizeof( _coord_array ) / sizeof( _coord_array[0] ), _coord_array };
const IntArray quad_normal = { sizeof( _normal_array ) / sizeof( _normal_array[0] ), _normal_array };
const IntArray quad_texcoord = { sizeof( _texcoord_array ) / sizeof( _texcoord_array[0] ), _texcoord_array };


/**
 * Primitive 초기화
 */
quad.coord = quad_coord;
quad.color = quad_color;
quad.texcoord = quad_texcoord;

/**
 * Render로의 설정
 */
/* 정점 변환 행렬 설정 */
OEMC_Micro3D_Atrans3i_multiply2( &vtrans, &view_trans, &vtrans );
OEMC_Micro3D_Render_setViewTrans( &render, &vtrans );

/* 사각 폴리곤(texture 폴리곤) ) */
OEMC_Micro3D_Render_drawPrimitive( &render,
M3DP_QUADS | M3DPD_TEXCOORD | M3DPD_NORMAL_PER_FACE |
M3DPD_COLOR_NONE | M3D_BLEND_NORM | M3D_LIGHTING | ( 1 << 16 ),
&quad.coord, &quad.normal, &quad.texcoord, NULL );

/* VRAM에 전송 */
OEMC_Micro3D_Render_flush( &render );