2012-04-29 2 views
4

그 검은 있습니다. 이 모든 일이 발생하고 일부 내 효과를 이상하게 보입니다.OpenGL을 투명 이미지는 내가 안드로이드를위한 게임을하고 있어요 내가 투명 이미지를 그릴 때마다 항상 약간 검은 투명 부분에 추가 할 수있을 것 같습니다 이유가 궁금

다음은 예입니다. 두 개의 원은 흐리게 보이는 흰색 이미지 일 뿐이지 만 서로 겹치는 부분은 그림자가있는 것을 볼 수 있습니다. Inkscape에서 서클 중 두 개가 겹쳐지면 중복되는 부분이 순수한 흰색으로 표시됩니다.

enter image description here

내 혼합을 위해

GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

을 사용하고 있습니다.

이런 일이 발생하는 이유 어떤 생각 나는 그것을 피할 수있는 방법?

편집 : 내가 생각할 수있는 유일한 것은 두 개의 이미지들이 대신 서로의 배경 만 혼합되어 어쩌면 같은 Z를 가지고있다?

편집

: 나는 여기에 내가 찾고 있던 결과

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_DST_ALPHA); 

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

을 변경했습니다.

enter image description here

있는 유일한 방법은 지금은 그 그들에 투명한 검은 색을 가지고 있던 투명 이미지는 내가 대상 알파 1. 하나의 마이너스 소스가를 추가 왜 생각하기 때문에 의미가있는 무시된다는 것입니다 회색?

+0

편집의 질문에 대해서는 틀렸고 불가능합니다. – Tim

+0

개인적으로 나는 그림자가 멋지다고 생각한다. 하지만 그건 나 뿐이야. – ashes999

답변

9

나는 그것을 고치는 법을 알아 냈다.당신은 (흰색 차례 회색을)를로드 할 때

나는

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

그것은 안드로이드 PNG 이미지의 텍스처의 알파를 사전에 곱한 것으로 나타났다에

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

을 변경했습니다.

나는 내 다른 색상의 곱셈을 할 내 버텍스 쉐이더에
vColor.r = vColor.r * vColor.a; 
vColor.g = vColor.g * vColor.a; 
vColor.b = vColor.b * vColor.a; 

을 추가했다.

+0

알파를 나눌 수 있습니다. 아래 내 의견을 읽으십시오. –

1

내용이 맞습니까? 원이 검은 색을 생성하지 않게하려면 이미지의 색상 값이 완전히 흰색이어야하며 알파 채널이 원의 모양을 정의해야합니다. 이제 알파 채널과 색상 값이 0으로 희미 해지는 흰색 원이 이미지에있는 것처럼 보입니다. 그러면 후광이 발생합니다.

+0

그래, 내 이미지가 완전히 흰색이고 흐림 및 모양이 알파 채널에 의해 정의됩니다. – EmbMicro

+1

그것은 그렇지만 어떤 라이브러리를 사용하고 있습니까? 분명히 귀하의 알파를 미리 곱합니다 –

0

선형 샘플링을 사용하고 있습니까? 제 생각에 매우 작은 이미지 (치수가 30-40 픽셀 미만인 경우)가 될 수 있습니다. 원의 내부 (알파 = 1)와 원의 외부 (알파 = 0). 이렇게하면 중간 알파 값이 생겨서 흐림 효과가 생깁니다.

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

어쩌면 당신은 당신이 우리가 그것을 검사 할 수 있도록 사용하고있는 실제 질감을 호스팅 할 수 있습니다 : 당신이 결합 된 원 텍스처가있을 때

다음 코드를 시도? 또한 이것이 도움이되지 않으면 도면 코드를 게시하십시오.

+0

나는 당신이 이해할 것이라고 생각하지 않습니다. 나는 희미 해지기를 원한다. 그것은 원래 이미지에있다. 원본에없는 것은 겹치는 부분입니다. 질문에 원본을 게시합니다. – EmbMicro

+0

@EmbMicro 오, 미안해, 오해했습니다. 원본 이미지의 두 서클 중 어느 것을 먼저 그렸는지, 깊이 테스트를 사용하는 경우 깊이 버퍼 설정은 어떤 것입니까? – Tim

0

텍스처를 내보낼 때 이미지 처리 소프트웨어가 알파 채널을 미리 곱할 수 있기 때문에 알파로 나눌 수도 있습니다. 나는 프래그먼트 쉐이더에 알파 분할을했다. 다음 코드는 HLSL,하지만 당신은 쉽게 GLSL로 변환 할 수 있습니다 :이 작업은 매우 손실과 심지어, 그것은 일반적인 솔루션 이와 같은 경우에 가장 가능성이 충분하지의 경우, 손실이다

float4 main(float4 tc: TEXCOORD0): COLOR0 
{ 
    float4 ts = tex2D(Tex0,tc); 

    //Divide out this pre-multiplied alpha 
    float3 outColor = ts.rgb/ts.a; 

    return float4(outColor, ts.a); 
} 

하는 것으로 . 귀하의 경우, 색을 완전히 무시하고 조각 쉐이더에서 원래의 알파 및 흰색을 제공 할 수 있습니다 (예 : return float4(1,1,1,ts.a); (GLSL로 변환)