문제

다양한 알파값이있는 RGBA 형식의 메모리에 텍스처가로드됩니다.

이미지는 그렇게로드됩니다 :

 GLuint texture = 0;
 glGenTextures(1, &texture);
 glBindTexture(GL_TEXTURE_2D, texture);
 self.texNum = texture;

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);
.

이미지의 알파 채널이 모든 1의 알파 채널을 처리하고 텍스처가 RGB 이미지처럼 그려 지도록 어떻게이 텍스처를 그릴 수 있는지 알고 싶습니다.

기본 이미지를 고려하십시오 :

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png < / P>

이 이미지는 0에서 255 알파까지의 진행이며

에서 255,0,02의 RGB 값을 갖습니다.

그러나 혼합 장애인으로 그릴 경우 다음과 같은 이미지를 얻습니다. www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

내가 정말로 원하는 것은 다음과 같이 보이는 이미지입니다. www.ldeo.columbia.edu/~jcoplan/alpha/correct.png

알파 채널을 완전히 무시할 수있는 포인터를 정말로 감사드립니다. 다른 점에서 알파 채널이 필요하기 때문에 처음에는 이미지를 RGB로로드 할 수 없습니다.

편집 : GL_COMBINE을 사용하여 내 문제를 해결하기 위해 다음과 같습니다.

glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
[self drawTexture];
.

그러나 여전히 행운이 없으므로 여전히 빨간색으로 검은 색으로 끌어들입니다.

도움이 되었습니까?

해결책

다양한 알파 값이있는 RGBA 형식의 메모리에 텍스처가로드됩니다

gldisable (gl_blend)

그러나 Blending Disablet로 그릴 경우 i : www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

처럼 보이는 이미지를 얻습니다.

소스 이미지에서 모든 투명한 픽셀이 검은 색이기 때문에 발생합니다.그것은 당신의 질감 / 이미지 또는 로더 기능이있는 문제입니다. 그러나 OpenGL 문제가 아닙니다.

아마 GLTExEnv (GL_COMBINE ...) (예 : 알파 채널을 기반으로하는 기본 색상으로 텍스처 색상 혼합)을 사용하여 해결하려고 할 수 있습니다.당신에게 정확한 피연산자를 줄 수는 없습니다.Direct3D9 (d3dtop_modulatealpha_addcolor 사용)에서 가능하므로 OpenGL에서 수행하는 방법이 있습니다.

다른 팁

블렌딩을 비활성화해서는 안되지만 glblendfunc 매개 변수 :

glBlendFunc(GL_ONE, GL_ZERO);
.

또는 OpenGL이 이미지의 RGB 채널 만 업로드하여

를 사용하여 이미지를 업로드 할 수 있습니다.
glPixelStorei(GL_UNPACK_ALIGNMENT, 4)
.

glTexImage2D로 설정된 형식으로 GL_RGB를 호출하기 전에.모든 픽셀의 4YTE를 건너 뛰게됩니다. 즉, 알파 채널.

나는 비슷한 문제가 있었고, iOS 이미지로드가 RBG 값에 대해 제기 된 것으로 밝혔으므로 (다른 답변 및 의견 중 일부에서 논의 된 바와 같이)사전 곱셈을 비활성화하는 방법이 있는지 여부를 알고 싶습니다. 그러나 그 동안 이 스레드 이 스레드 .

    // un pre-multiply
    uint8_t *imageBytes = (uint8_t *)imageData ;
    int byteCount = width*height*4 ;
    for (int i=0; i < byteCount; i+= 4) {
        uint8_t a = imageBytes[i+3] ;
        if (a!=255 && a!=0 ){
            float alphaFactor = 255.0/a ;
            imageBytes[i] *= alphaFactor ; 
            imageBytes[i+1] *= alphaFactor ; 
            imageBytes[i+2] *= alphaFactor ; 
        }
    }
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top