2011-09-16 2 views
2

다른 공간이지만 관련 공간이라고 생각하기 때문에 이것을 OpenGL에서 태그 지정합니다.Photoshop과 같은 "lighten"프래그먼트 셰이더의 문제점

OpenGL (ES2?)을 사용하는 Flash 11에서 포토샵과 같은 블렌딩을 사용하려고합니다. 나는 밝혀야 할 밝기와 관련하여 특별한 이슈를 가지고 있습니다 :

outputColor.rgb = max (base.rgb, blend.rgb);

내 레이어에 투명성이 있기 때문에 문제가 있다고 생각합니다. 그러나 레이어를 미리 곱해도 여전히 문제가 있습니다 (이미지가 너무 어둡습니다).

여기 단계가 빠졌습니까? (이것은 AGAL, ​​Adobe의 GL 어셈블리입니다.)

[Shader.Fragment] 
tex ft0, v0, fs0 <2d,nearest,nomip,clamp> 
tex ft1, v0, fs1 <2d,nearest,nomip,clamp> 

// premultiply 
mul ft2, ft1.xyzw, ft1.wwww 

// premultiplied values 
max oc, ft0, ft2 

답변

3

주의 할 점은 알파 또한 자체적으로 곱하는 것입니다.

그래서 대신에 검은 색과 혼합하면 어두운 이미지로 이어질 것입니다 (RA, GA, 바, A), 당신이 출력된다 (RA, GA, BA, AA)을 갖는

당신은 시도 할 수 있습니다 이렇게하면 :

// premultiply 
mul ft2, ft1.xyzw, ft1.wwww 
mov ft2.w, ft1.w 

// premultiplied values 
max oc, ft0, ft2 
+0

그래, 나는 그것도 움직이려고했거나 심지어 0으로 설정하는 것을 잊어 버렸다는 것을 잊어 버렸지 만, 여전히 올바르지 않습니다. 미리 곱해진 값을 가진 원본 이미지를 처리해야 할 수도 있습니다 ... – ansiart

+0

당신이 맞을지도 모르겠지만, Flash는 미리 이미지를 만들고, 그것을 곱셈 해 봅니다. 어떤 OpenGL 블렌딩 상태를 사용하고 있습니까? – crazyjul

+0

src_alpha : one_minus_src_alpha. 그렇습니다. 미리 배가 된 값으로이를 망칠 수 있습니다. 내 모든 텍스처를 프레임 버퍼링하거나 수동으로 다중화해야하는 것처럼 보입니다. Thansk 당신의 도움! – ansiart

0

crazyjul 언급했듯이 알파 미리 곱셈 된 값에서 원래 색상 값을 복원해야합니다. 나는 다음과 같은 코드가 작동해야한다고 생각합니다 :

tex ft0, v0, fs0 <2d, nearest, nomip, clamp> 
tex ft1, v0, fs1 <2d, nearest, nomip, clamp> 

max ft0, ft0, fc0 
div ft0.xyz, ft0.xyz, ft0.www // obtain original color 1 

max ft1, ft1, fc0 
div ft0.xyz, ft0.xyz, ft0.www // obtain original color 2 

max ft1.xyz, ft0.xyz, ft1.xyz // lighten 

mul ft1.xyz, ft1.xyz, ft1.www // pre-multiply output color with the second alpha 
mov oc, ft1 

라인 max ft0, ft0, fc0max ft1, ft1, fc0 제로 알파 값에 의해 divizion을 피하기 위해 필요하다. 0,0,0,0.001과 같은 smth를 포함하도록 fc0 상수를 설정할 수 있습니다.

또한 결과 알파로 두 번째 레이어의 알파 (ft1)를 사용합니다. 그것이 옳은지 나는 모른다.