알파 채널을 무시하면서 OpenGL에서 텍스처를 그립니다.
-
13-09-2020 - |
문제
다양한 알파값이있는 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 이미지처럼 그려 지도록 어떻게이 텍스처를 그릴 수 있는지 알고 싶습니다.
기본 이미지를 고려하십시오 :
< / 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 ;
}
}
.