2009-06-16 3 views
3

블렌드가 목적을 달성 할 때까지 주 이미지를 완전히 불투명하게 유지하면서 24 비트 비트 맵의 ​​배경을 제거하는 방법을 찾고 있지만 지금은 주 비트는 불투명하다. Google에서 검색했지만 아무 도움이되지 않는다고 생각합니다. 잘못된 검색어를 검색하고 있으므로 도움이 될 것입니다.OpenGL의 텍스처에서 검정색 배경을 제거하는 방법

편집 : 예 죄송합니다, 지금 배경으로 검은 색을 사용 중입니다.

+0

나는 검은 색과 같은 지정된 색에 대해 이야기하고 있습니다. R0G0B0? –

답변

8

는 OpenGL을위한 질감을 만드는, 32 비트 RGBA 질감과 텍스처를 만들 수 있습니다 : 당신이 다음이 작업을 수행 한 경우 당신은 조화가 활성화해야합니다. 이 새로운 32 비트 텍스처의 내용을 담을 버퍼를 만들고 24 비트 비트 맵을 반복합니다. 배경색을 찾을 때마다 새로운 32 비트 비트 맵에서 알파를 0으로 설정하십시오.

struct Color32; 
struct Color24; 

void Load24BitTexture(Color24* ipTex24, int width, int height) 
{ 
    Color32* lpTex32 = new Color32[width*height]; 

    for(x = 0; x < width; x++) 
    { 
     for(y = 0; y < height; y++) 
     { 
     int index = y*width+x; 
     lpTex32[index].r = ipTex24[index].r; 
     lpTex32[index].g = ipTex24[index].g; 
     lpTex32[index].b = ipTex24[index].b; 

     if(ipTex24[index] == BackgroundColor) 
      lpTex32[index].a = 0; 
     else 
      lpTex32[index].a = 255; 
     } 
    } 

    glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, lpTex32); 

    delete [] lpTex32; 
} 
+0

환상적이고 정확하게 내가 찾고있는 것이 었습니다. 나는 알파 채널이 OGL에서 어떻게 읽혀 지는지 확신 할 수 없었다. 인터넷 검색을하고 코드를 읽은 후에 나는 분류되어 있고 갈 준비가되었다고 생각한다. 고맙습니다 :) – Auraomega

-1

그림 영역을 제한하는 이런 종류의 작업에만 사용되는 스텐실 버퍼를 찾는 것처럼 들리 네요.

버퍼는 각 픽셀과 연관된 값을 저장합니다.이 값은 1 개의 후속 드로잉이 렌더링되고 0이면 마스크됩니다. 보통 스텐실 버퍼는 멀티 패스 렌더링 기술과 함께 사용되어 반사 및 헤드 업 디스플레이와 같은 것을 만듭니다.

0

약간 혼란 스럽습니다. 24 비트 이미지에는 투명도가 없으며 단순히 RGB 값의 배열입니다. "메인 비트를 불투명하게 유지"한다는 것은 무엇을 의미합니까? 모든 검은 색 픽셀과 같은 특정 색의 모든 픽셀을 투명하게 만들고 싶습니까? 이것이 원하는 경우 Google opengl transparency mask (예 : NeHe #20 참조)을 사용할 수 있습니다.

+0

나는 원래 블랙을 제거하기 위해 블렌드 함수를 사용했지만, 불투명 대신에 반투명 중앙 이미지를 남겼다. 저는 과거에는 투명 마스크를 사용 했었지만 많은 문제가 있었고 이미지 당 다른 파일을 필요로하지 않았습니다. – Auraomega

+0

아하, 이제는 이해할 것 같아. 충분한 메모리가 있다면 다른 사람들이 지적한 것처럼 이미지의 알파 채널로 이동하십시오. – zoul

0

정말 필요한 것은 이미지의 알파 채널입니다. 24 비트이기 때문에 하나도 만들지는 않겠지 만 모든 검은 색 (0x000000) 픽셀에 알파를 0으로 설정하여 이미지를로드하면 즉석에서 하나를 만들 수 있습니다

+1

그가 불타는 데 충분한 메모리가 있다면 이것은 아마도 가장 쉬운 해결책 일 것입니다. 그렇지 않다면 색인 된 투명성에 전체 8 비트 알파 채널을 사용하는 것은 낭비 일 것입니다. – zoul

2

텍스처를로드해야합니다 glTexImage2D 호출에서 GL_RGBA 형식으로.

/* Set up blend */ 
glEnable(GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+1

나는 완전히 질문을 오해하지만 한 ~ ~ 내 대답을 삭제 실 거예요 그래서 블렌드를 활성화해야합니다. –

관련 문제