하드 및 빠른 의미에서 .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라고 말했어. 설명서를 스캔하면 해당 GLenum
이 GL_RGB
임을 알 수 있습니다. 당신은 각 채널이 1 바이트 크기라고 말하고 있습니다. 그래서 GL_UNSIGNED_BYTE
입니다. 데이터를 data
에로드했습니다. 그래서 :
glDrawPixels(256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);
또한 의견 : 분명히에 구축하기 위해 당신이했습니다 있도록 먼저 작업 뭔가를 얻을 수 있지만, glDrawPixels
은 실제로는 거의 사용되지 않습니다. 결과적으로 OpenGL ES 또는 이에 상응하는 WebGL의 일부가 아닙니다. 그 물건의 의미를 보라. 전화 할 때마다 버퍼를 제공합니다. OpenGL은 마지막 호출 이후에 OpenGL이 수정되었는지 여부를 알 수 없습니다. 따라서 모든 호출은 CPU에서 GPU로 데이터를 전송합니다. 지오메트리를 사용하여 텍스처 및 도면으로 한 번 데이터를 제출하십시오. 그러면 통화 당 전송 비용이 절약되므로 훨씬 효율적입니다.
OP의 폭과 높이는 ** 257 **입니까? 추측 할 수없는 힘이 아닌 ** 257 ** x ** 3 ** mod ** 4 **! = ** 0 **이기 때문에 실제로는 매우 당혹 스럽습니다. 즉, 기본 픽셀 압축 해제 정렬 (행 당 4 바이트)이 잘못되어 이미지의 각 행이 잘못된 위치에서 시작될 때 기울어 진 재앙이 나옵니다.) –
@ AndonM.Coleman 오타가 수정되었습니다. 그러나 네,'GL_UNPACK_ALIGNMENT'에 대한 언급이 필요할 것입니다. 또는 예를 들어 http://stackoverflow.com/questions/11042027/glpixelstoreigl-unpack-alignment-1-disadvantages – Tommy