2014-12-26 2 views
1

.raw 이미지 형식을 읽고 OpenGL에서 이미지 형식을 수정하려고합니다. 나는이 같은 이미지를 읽을 수 있습니다OpenGL에서 .raw 파일을 사용하는 방법

int width, height; 
BYTE * data; 
FILE * file; 

file = fopen(filename, "rb"); 
if (file == NULL) return 0; 

width = 256; 
height = 256; 
data = malloc(width * height * 3); 

fread(data, width * height * 3, 1, file); 
fclose(file); 

하지만 난 그림을 그릴 glDrawPixels를 사용하는 방법을 잘 모릅니다.

두 번째 문제점은 각 픽셀에 어떻게 액세스 할 수 있는지 잘 모르는 것입니다. .raw 이미지 형식에서 각 픽셀은 RGB 값을 저장하는 3 개의 정수 여야합니다 (맞습니까?). 이 RGB 값에 직접 액세스하려면 어떻게해야합니까?

답변

2

하드 및 빠른 의미에서 .raw와 같은 것은 없습니다. 이름은 헤더가없는 이미지 데이터를 의미하지만 데이터 형식은 지정하지 않습니다. RGB는 그렇지만 RGBA도 그렇고 거의 끝이없는 다른 가능성을 생각하는 것은 사소한 일입니다.

채널별로 1 바이트 씩 RGB 순서를 가정하면 각 픽셀의 너비는 3 바이트입니다. 그래서 n 화소는 다음 화소가 왼쪽에서 오른쪽 순서로 저장되도록 데이터를 가정

r = data[n*3 + 0] 
g = data[n*3 + 1] 
b = data[n*3 + 2] 

규정되어 라인마다, 그 첫번째 라인의 화소는 X = 3에있다에서

r = data[(x + y*width)*3 + 0] 
g = data[(x + y*width)*3 + 1] 
b = data[(x + y*width)*3 + 2] 
: N = 3 초에 등은 N = (처음 두 줄의 결합 폭) +3에서의 제 그래서

에서, N = (제 1 라인의 폭) +3에서의

glDrawPixels을 사용하려면 the manual에 매개 변수로 지정하라는 메시지를 따르십시오. 그것은 말합니다 :

void glDrawPixels( GLsizei  width, 
        GLsizei  height, 
        GLenum  format, 
        GLenum  type, 
        const GLvoid *  data); 

너는 그 크기가 256이라고 말했어. 당신은 그 형식이 RGB라고 말했어. 설명서를 스캔하면 해당 GLenumGL_RGB임을 알 수 있습니다. 당신은 각 채널이 1 바이트 크기라고 말하고 있습니다. 그래서 GL_UNSIGNED_BYTE입니다. 데이터를 data에로드했습니다. 그래서 :

glDrawPixels(256, 256, GL_RGB, GL_UNSIGNED_BYTE, data); 

또한 의견 : 분명히에 구축하기 위해 당신이했습니다 있도록 먼저 작업 뭔가를 얻을 수 있지만, glDrawPixels은 실제로는 거의 사용되지 않습니다. 결과적으로 OpenGL ES 또는 이에 상응하는 WebGL의 일부가 아닙니다. 그 물건의 의미를 보라. 전화 할 때마다 버퍼를 제공합니다. OpenGL은 마지막 호출 이후에 OpenGL이 수정되었는지 여부를 알 수 없습니다. 따라서 모든 호출은 CPU에서 GPU로 데이터를 전송합니다. 지오메트리를 사용하여 텍스처 및 도면으로 한 번 데이터를 제출하십시오. 그러면 통화 당 전송 비용이 절약되므로 훨씬 효율적입니다.

+1

OP의 폭과 높이는 ** 257 **입니까? 추측 할 수없는 힘이 아닌 ** 257 ** x ** 3 ** mod ** 4 **! = ** 0 **이기 때문에 실제로는 매우 당혹 스럽습니다. 즉, 기본 픽셀 압축 해제 정렬 (행 ​​당 4 바이트)이 잘못되어 이미지의 각 행이 잘못된 위치에서 시작될 때 기울어 진 재앙이 나옵니다.) –

+0

@ AndonM.Coleman 오타가 수정되었습니다. 그러나 네,'GL_UNPACK_ALIGNMENT'에 대한 언급이 필요할 것입니다. 또는 예를 들어 http://stackoverflow.com/questions/11042027/glpixelstoreigl-unpack-alignment-1-disadvantages – Tommy

관련 문제