1. 2013. 6. 9. 18:45 Graphic/OpenGL
opengl 의 개체 버퍼를 통하여 텍스쳐를 로드시키는 방법
당연히 빠른 로딩을 하려면 반드시 적용해야 될 부분입니다

아래와 같은 단계로써 텍스쳐를 비디오 메모리로 올려 보내게 되는데요
스토리지
-버퍼를 통한 로드->
비디오 메모리
스토리지는 데이터를 불러오는 저장공간 입니다, 웹 혹은 하드디스크 그외, 여러가지로요


함수를 참고하여 하나씩 설명 하겠습니다
openGL 초기화 개체는 생략 했어요, ( 플랫폼 마다 달라서요... glu,glx 기타등등 프레임워크를 사용하면 훨씬 편합니다 )

버퍼/텍스쳐 생성
C++
GLenum buffer[2],texture[2]; glGenBuffers(2, &buffer[0]);
glGenTextures(2, &texture[0]);
Pascal
var buffer,texture: array [0..1] of GLenum; glGenBuffers(2, @buffer[0]);
glGenTextures(2, @texture[0]);

GL 버퍼 개체를 픽셀버퍼로 선택, 생성(1920*1080*3 : RGB채널 1080p), STATIC : 한번 편집 여러번 사용, DYNAMIC : 여러번 편집 여러번 사용
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer[0]);
glBufferData(GL_PIXEL_UNPACK_BUFFER,1920*1080*3, nil, GL_STATIC_DRAW);

비디오 메모리를 시스템 가상 메모리에 매핑 받습니다
메모리포인터 := glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
FillMemory(메모리포인터,1920*1080*2,127);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);


버퍼의 자료를 텍스쳐로 가져옵니다
텍스쳐를 GL_TEXTURE_2D 로 선택, 텍스쳐 파래미터 지정, 버퍼로부터 데이터를 붙임
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 1920, 1080, 0, GL_RGB, GL_UNSIGNED_BYTE, nil);

PBO ( Pixel Buffer Object )라고도 불리는데 이 것이 다 네요
버텍스 버퍼, 텍스쳐 버퍼 도 있습니다
참고 함수 : glGetBufferSubData, glGetTexImage ( 버퍼,텍스쳐 데이터를 뽑아오는 함수 입니다, 다른 함수는 구글 검색 : "gl함수명 wiki" )
Posted by Nightly Luna
,
® © Tanny Tales
/ rss