텍스쳐 매핑 실습
체크무니 텍스쳐 생성 및 매핑 GLubyte check[512][512][3]={0,}; int i, j; for(i=0; i<512; i++) for (j=0; j<512; j++) if((i/64+j/64)%2) check[i][j][0]=255;
메인 메모리의 내용을 프레임 버퍼로 복사 glRasterPos*{2i,2f,..}(): 현재 래스터 위치 지정 glDrawPixels(GLsizei width, Glsizei height, GLenum format, GLenum type, GLvoid *image); The glDrawPixels function writes a block of pixels to the framebuffer. format: GL_RGB, GL_RGBA,…. type: GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT,… 픽셀 사각형은 현재 래스터 위치를 왼쪽 아래 모서리 지점으로 지정
평행사변형에 수동매핑 텍스쳐 객체 사용하여 매핑 평행사변형 vertexes: {(-0.5,-0.5,0),(0,-0.5,0), (0.5,0.5,0), (0,0.5,0)} 텍스처 확장: s와 t 방향으로 GL_REPEAT 사용 앤티에일리어싱: 확장, 축소에 GL_NEAREST 사용 텍스쳐 환경: GL_MODULATE glTexImage2D() 사용 glEnable(GL_TEXTURE_2D); glTexCoord2f() 사용 수동 매핑 텍스쳐 객체 사용하여 매핑 glGenTexture() glBindTexture()
텍스처 매핑 ex_cube.cpp를 이용하여 checkerboard texture를 정육면체에 매핑하여라
텍스처 매핑 텍스처 crate.raw(256X256, GL_RGB)를 입력 받아 cube에 다음과 같이 매핑하여라
#include <stdio.h> unsigned char my_texture[256][256][3]; void texture_read(){ FILE *infile = fopen("crate.raw","rb"); if(infile == NULL){ printf("File open failed."); return; } fread(my_texture, sizeof(char), 256*256*3, infile); fclose(infile); ()에서 texture_read() 호출
이차곡면 렌더링 GLUquadricObj* gluNewQuadric (); 새로운 이차곡면 객체를 만들고 객체의 포인터를 반환한다. void gluQuadricDrawStyle (GLUquadricObj *quad , Glenum drawStyle ); drawStyle을 사용하여 이차원 곡면 quad의 제작 스타일을 조절한다. quad : quadrics object (created with gluNewQuadric). drawStyle : the desired draw style. Valid values are GLU_FILL, GLU_LINE, GLU_SILHOUETTE, and GLU_POINT. gluNewQuadric();로 만들어진 객체에 원하는 타입 루틴 호출(곡면종류) gluDisk (quad , inner , outer , slices , loops ) renders a disk on the z = 0 plane. The disk has a radius of outer, and contains a concentric circular hole with a radius of inner. gluSphere (quad , radius , slices , stacks ) draws a sphere of the given radius centered around the origin. gluPartialDisk (quad , inner , outer , slices , loops , start , sweep ) start: start angle(0=12 o'clock), sweep: sweep angle void gluCylinder (GLUquadric* quad , GLdouble base , GLdouble top , GLdouble height , GLint slices , GLint stacks ); base :the radius of the cylinder at z=0. top : the radius of the cylinder at z=height.
1D 띠무니 텍스쳐 텍스쳐를 이차원 곡면에 매핑 GL_REPLACE GL_MODULATE
unsigned int MyTextureObject; GLUquadricObj *qobj; qobj = gluNewQuadric( ); gluQuadricDrawStyle(qobj, GLU_FILL); MyStripeImage( ); glGenTextures(1, &MyTextureObject); glBindTexture(GL_TEXTURE_1D, MyTextureObject); glTexImage1D(GL_TEXTURE_1D, 0, 4, stripeImageWidth, 0, GL_RGBA, GL_UNSIGNED_BYTE, stripeImage); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_S, GL_OBJECT_PLANE, ref_plane); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_1D);
띠무니 텍스쳐 다음과 같이 텍스쳐를 만들어 자동텍스쳐 매핑 방법을 이용하여 원구에 매핑하시오 기준평면을 바꾸어 보시오 GL_REPLACE GL_MODULATE
void MyStripeImage(){ int j,k; for (j=0; j<512; j++){ if((GLubyte)(j/64)%2) { stripeImage[4*j]= (GLubyte) 255; stripeImage[4*j+1]= (GLubyte) 0; stripeImage[4*j+2]= (GLubyte) 0; stripeImage[4*j+3]= (GLubyte) 0; } else for(k=0;k<4;k++) stripeImage[4*j+k]= (GLubyte) 0;
2D 체크무니 텍스쳐 2D checkerboard 텍스쳐를 이용하여 자동텍스쳐 매핑 방법을 이용하여 원구에 매핑하시오 ref_plane_s[]={1,0,0,0} ref_plane_t[]={0,1,0,0} GL_REPLACE GL_MODULATE
glGenTextures(1, &ObjectId); glBindTexture(GL_TEXTURE_2D, ObjectId); makecheckboard(); //텍스쳐객체사용 glGenTextures(1, &ObjectId); glBindTexture(GL_TEXTURE_2D, ObjectId); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, check); //object_linear glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_S, GL_OBJECT_PLANE, ref_plane_s); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_T, GL_OBJECT_PLANE, ref_plane_t); //물체가이동하지않을때는두개가같다 //eye_linear glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST); //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D);
다음과 같이 2D 텍스쳐가 매핑되도록 기준 평면을 설정하시오
비트맵 파일 텍스쳐 비트맵 파일을 메모리로 로딩 윈도우용 AUX(OpenGL auxiliary library) 프로젝트->속성->링커->입력->추가종속성->glaux.lib 입력 AUX_RGBImageRec *pTextureImage[1]; //텍스쳐 저장 공간을 가리키는 포인터 AUX_RGBImageRec * LoadBMP(char *szFilename) { FILE * pFile = NULL; if(!szFilename){ return NULL; } pFile = fopen(szFilename,"r"); if(pFile){ fclose(pFile); return auxDIBImageLoadA(szFilename); //파일로부터 메모리로 }AUX_RGBImageRec 구조체는 AUX 라이브러리의 자료형으로 BMP 파일의 크기와 그림 데이타 포인터를 가지고 있다.
파일을 로드하고 텍스쳐로 변환 int LoadGLTextures(char * szFilePath){ //파일을 로드하고 텍스쳐로 변환 int Status = FALSE; glClearColor(0.0, 0.0, 0.0, 0.5); memset(pTextureImage, 0, sizeof(void *)*1); //포인터를 널로 //비트맵을 로드하고 오류확인 if (pTextureImage[0]=LoadBMP(szFilePath)){ Status=TRUE; //상태 플랙을 True로 glGenTextures(1, &MyTextureObject[0]); //텍스쳐 생성 glBindTexture(GL_TEXTURE_2D, MyTextureObject[0]); glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage[0]->sizeX, pTextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pTextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glEnable(GL_TEXTURE_2D); } if (pTextureImage[0]){ //텍스쳐가 존재하면 if (pTextureImage[0]->data){ //텍스쳐 영상이 존재하면 free(pTextureImage[0]->data); //텍스쳐 영상공간 반납 } free(pTextureImage[0]); //텍스쳐 반납 return Status;
주변매핑 시야각 360 사진 필요 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S);
HW 자신의 다른 모습의 사진 3장 이상을 bitmap파일로 만들어서 텍스쳐로 정육면체 붙이고 조명과 음영을 주어 앞 예제처럼 타이머를 이용하여 회전시키시오