2017-10-19 2 views
2

좋아요. 그렇다면 자신의 텍스처/이미지 데이터를 만든 다음 OpenGL에서 쿼드로 표시해야합니다. 쿼드가 작동하고 자체 텍스처 로더로 TGA 파일을 표시 할 수 있으며 쿼드로 완벽하게 매핑됩니다.OpenGL 텍스처 형식으로 OpenGL 용 이미지/텍스처 데이터를 생성하십시오.

하지만 각 픽셀에 대해 1000x1000 및 3 채널 (RGB 값) 인 "직접 만든 이미지"를 어떻게 만듭니 까? 텍스처 배열의 형식은 무엇입니까? 예를 들어 pixel (100,100)을 검정색으로 설정하는 방법은 무엇입니까?

#DEFINE SCREEN_WIDTH 1000 
#DEFINE SCREEN_HEIGHT 1000 

unsigned int* texdata = new unsigned int[SCREEN_HEIGHT * SCREEN_WIDTH * 3]; 
for(int i=0; i<SCREEN_HEIGHT * SCREEN_WIDTH * 3; i++) 
     texdata[i] = 255; 

GLuint t = 0; 
glEnable(GL_TEXTURE_2D); 
glGenTextures(1, &t); 
glBindTexture(GL_TEXTURE_2D, t); 

// Set parameters to determine how the texture is resized 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR); 
// Set parameters to determine how the texture wraps at edges 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_REPEAT); 
// Read the texture data from file and upload it to the GPU 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
      GL_RGB, GL_UNSIGNED_BYTE, texdata); 
glGenerateMipmap(GL_TEXTURE_2D); 

편집 :

내가 완전히 흰색 이미지/텍스처를 위해 그것을 상상하는 방법입니다 답변 아래 정확하지만 나는 또한 OpenGL을 내가 사용하는 정상의 int를 처리하지 않는 것을 발견하지만, 그것은 작동 uint8_t로 괜찮습니다. GPU에 업로드 할 때 GL_UNSIGNED_BYTE (8 비트 및 일반 int는 8 비트가 아님) 플래그와 함께 GL_RGB 플래그라고 가정합니다.

+0

이해가 안, 당신이 그 일을 시도해야 ? 이미지 데이터 대신 데이터가있는 큰 덩어리의 바이트를 전달하면됩니다. 이미지 로더의 데이터를 GL 텍스처로 전달한 다음 자체 제작 된 이미지 데이터를 텍스처로 전달하고 작동하지 않는 것을 알려주는 코드를 게시하는 코드. – zero298

+0

OpenGL에서 부호없는 8 비트 정수를 생성하여 RGB 값으로 올바르게 해석해야한다는 것을 알았습니다. 나는 글자 그대로 이것을 며칠 동안 시도해 보았고, 이것을 게시하기로 결정한 후 2 분이 지나면 해결할 수 있었다 .... – Jackbob

+0

'GL_UNSIGNED_INT'는 유효한'glTexImage2D()''도'type'이다. [0, 2^8-1]에서 [0, 2^32-1]까지 색상 채널 범위를 확장하면됩니다. – genpfault

답변

3

하지만 각 픽셀에 대해 1000x1000 및 3 채널 (RGB 값) 인 "직접 만든 이미지"를 어떻게 만듭니 까? 텍스처 배열

레드 바이트, 녹색으로 바이트 다음, 블루 바이트의 형식은 무엇

std::vector< unsigned char > image(1000 * 1000 * 3 /* bytes per pixel */); 

. 반복.

어떻게 픽셀 (100,100)을 검정으로 설정합니까?

unsigned int width = 1000; 
unsigned int x = 100; 
unsigned int y = 100; 
unsigned int location = (x + (y * width)) * 3; 
image[ location + 0 ] = 0; // R 
image[ location + 1 ] = 0; // G 
image[ location + 2 ] = 0; // B 

업로드를 통해 :

// the rows in the image array don't have any padding 
// so set GL_UNPACK_ALIGNMENT to 1 (instead of the default of 4) 
// https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexImage2D 
    (
    GL_TEXTURE_2D, 0, 
    GL_RGB, 1000, 1000, 0, 
    GL_RGB, GL_UNSIGNED_BYTE, &image[0] 
    ); 
+0

@lisyarus : Doh! 수정 주셔서 감사합니다 :) – genpfault

+0

당신은 오신 것을 환영합니다! 나는 또한 언팩 정렬을 설명하는 것이 좋을 것이라고 생각한다. – lisyarus

+0

감사! 나는 며칠 동안 노력한 후에도 그것을 해결할 수있었습니다. OpenGL은 너무 큰 변수에 익숙하지 않아서 처리 할 수 ​​없기 때문에 보통 unsigned ints를 사용할 수없는 것 같지만 uint8_t를 사용하여 8 비트를 만듭니다. – Jackbob

1

당신이 단단히 포장 된 두 개의 차원 텍스처 이미지 (glTexImage2D)을 지정하려는 경우, 당신은 GL_UNPACK_ALIGNMENT 1을 설정해야합니다 (glPixelStore 참조).

glPixelStore(GL_UNPACK_ALIGNMENT, 1); 

는 soure 형식 GL_UNSIGNED_BYTEGL_RGB 3 개 색상 채널 (적색, 녹색 및 청색)의 각각의 컬러 채널은 범위 내에서 한 바이트에 저장된다 [0, 255]의 각 화소 consits을 사용하기 때문이다. 당신은 색상 R, GB는이이 같은 수행에 (x, y)에서 픽셀을 설정하려면

:

texdata[(y*WIDTH+x)*3+0] = R; 
texdata[(y*WIDTH+x)*3+1] = G; 
texdata[(y*WIDTH+x)*3+2] = B;