2012-04-20 4 views
0

아래 질문에 대한 답변을드립니다. 도움을 주신 gavinb에게 감사드립니다.Uint8을 부호없는 char RGB 값으로 변환하십시오.

질문 : 학습 경험을 위해 텍스처를 복제하려고합니다. 24 비트 TGA 이미지를 사용 중이며 SDL로로드하고 있습니다. 나는 OpenGL을 텍스처에이를 보낼 계획하고있어 내가 직접,면> 픽셀을 보낼 때이 작업을 수행 : 나는 내 자신의 구조

OLD
struct Colour24 
{ 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
} 

unsigned char* texture = new unsigned char[width * height * 3]; 

    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      int index = (y * width) + x; 

      Colour24 colour = getColourAt(x, y); 

      newTexture[index] = colour.r; 
      newTexture[index + 1] = colour.g; 
      newTexture[index + 2] = colour.b; 
     } 
    } 

Colour24 getColour(int x, int y) 
{ 
    Uint32 pixel; 
    Uint8 red, green, blue; 
    Colour24 rgb; 

    pixel = getPixel(m_surface, x, y); // using the SDL get pixel function 

    SDL_GetRGB(pixel, m_surface->format, &red, &green, &blue); 

    rgb.r = red; 
    rgb.b = blue; 
    rgb.g = green; 

    return rgb; 
} 

을 만들었습니다. 하지만 직접 데이터 배열을 만들고 싶습니다. 도움이 대단히 감사합니다!

편집 : 죄송합니다. 나 자신을 충분히 설명하지 못했습니다. 24 비트 TGA 이미지가 들어있는 SDL_Surface에서 텍스처를 수동으로 다시 만들려고합니다. 그런 다음 텍스처를 생성하기 위해 OpenGL에 줄 것입니다. 내 표면 -> 픽셀로 내 OpenGL 코드를 테스트하고 잘 작동합니다. 나는 그걸 로딩하는 것을 잘못 처리 한 것뿐입니다.

+0

?컴파일러 오류? 당신이 기대하는 것을하지 않습니까? 최소한 코드는 함수 정의의 동일한 레벨에 코드를 포함하므로 불완전합니다. – bjhend

+0

이 텍스처를 OpenGL에로드 할 수 있지만 올바르지 않습니다. 나는 빨강, 초록 및 파랑 십자가가 부화하는 것을 많이 봅니다. – rocklobster

답변

1

내 자신의 TGA 로더 작성을 끝내고 높이를 픽셀 당 바이트로 곱해야한다는 것을 알았습니다. 아직 100 % 확실하지는 않지만 (의견을 자유롭게 생각해보십시오.)하지만 지금은 효과가 있습니다.

코드 : 문제가 정확히 무엇

TGAReader* reader = new TGAReader(); 
reader->readSurface("MyTexture.tga"); 

int height = reader->height; 
int width = reader->width; 
int bpp = reader->bpp; 

unsigned char* texture = new unsigned char[width * height * bpp]; 

for (int y = 0; y < height * bpp; y++) 
{ 
    for (int x = 0; x < width; x += 3) 
    { 
     int index = (y * width) + x; 

     Colour24 colour = reader->getColourAt(x, y); 

     newTexture[index] = colour.r; 
     newTexture[index + 1] = colour.g; 
     newTexture[index + 2] = colour.b; 
    } 
} 
// create OpenGL texture 
unsigned int = createTextureFromData(newTexture, width, height, bpp); 

// reading tga data 
Colour24 TGAReader::getColourAt(int x, int y) 
{ 
    Colour24 rgb; 

    rgb.r = m_data[((y * width) + x)]; 
    rgb.g = m_data[((y * width) + x) + 1]; 
    rgb.b = m_data[((y * width) + x) + 2]; 

    return rgb; 
} 
0

Uint8의 크기는 선언에 따라 다릅니다. 반면에 unsigned char의 크기는 많은 플랫폼에서 8 비트이지만 C++ 표준의 정확히 8 비트로 지정되지 않습니다.

변환 오류를 피하려면 Colour24Uint8을 직접 사용하는 것이 좋습니다.

+0

고마워, 나는 지금 당장 그것을 시도 할 것이다. – rocklobster

+0

수정 : 방금 확인했습니다. Uint8은 uint8_t의 typedef이며 unsigned char의 typedef입니다 ... – rocklobster

2

믿을 수 없을 정도로 난해한 아키텍처를 사용하지 않는 한 unsigned char은 거의 확실하게 uint8_t과 같습니다.

하지만 코드에 몇 가지 문제가 있습니다.하지만 정확히 무엇을 하려는지 또는 문제가 무엇인지 명확하지 않습니다.

먼저 getColourAt()를 호출 할 때 x, y 좌표를 전 환했습니다.

Colour24 colour = getColourAt(j, i); 

은 아마이 X, Y의 이름을 고수하는 것이 더 간단 할 것이다 : 따라서 나는 당신이 인덱스에 인덱스 높이와 J 폭을 나는를 사용하고, 그래서 당신은 J를 사용한다.

둘째, 텍스처 버퍼에 대한 인덱싱이 잘못되었습니다. 그것은해야한다 :

texture[i*width+j+0] = colour.red; 
texture[i*width+j+1] = colour.green; 
texture[i*width+j+2] = colour.blue; 

당신이 width 바이트 i 완전한 행, 그리고 불완전한 행에 j 바이트를 가질 것이기 때문이다.

또한 SDL_GetRGB 호출에서 픽셀 형식이 누락되어 컴파일되지 않습니다.

마지막으로 getColour() 함수가 올바르게 작동하지 않습니다. x, y에 의해 이미지에 오프셋되지 않으므로 항상 0,0의 픽셀 값을 반환합니다. 위와 동일한 기법을 사용할 수 있습니다. SDL과 함께 UInt32를 사용하는 것처럼 RGBA (32 비트) 픽셀 형식을 암시하지만 RGB (24 비트)를 사용하는 것처럼 인덱싱에주의하십시오.

+0

지금 테스트하십시오. 나는 또한 원래 게시물을 명확하게 편집했습니다. – rocklobster

+0

좋아, 내가 사용중인 새로운 코드로 원래 게시물을 업데이트했습니다. 나는 다른 결과를 가지고있다. 그러나 아직도 이상한 그것들. – rocklobster

+1

텍스처 버퍼에 y 값 인덱싱을 곱하면 높이가 아닌 너비를 사용해야합니다. 또한 픽셀은 UInt32이므로 위의 트랩에서 24bpp가 아닌 32bpp로 버퍼를 처리하게됩니다. 모든 픽셀 형식에서 사용할 수있는 완벽한 솔루션을 보려면 http://www.libsdl.org/cgi/docwiki.cgi/Introduction_to_SDL_Video#getpixel을 확인하십시오. – gavinb

관련 문제