2014-10-08 3 views
0

LibGDX에서 두 개의 텍스처 (.PNG) 이미지를 내 셰이더에 추가하려고합니다. 수학/블렌딩 부분을 제외한 모든 기능이 뛰어납니다. 다행히 누군가가이 혼합 문제를 도와 줄 수 있습니다!LIBGDX- 셰이더에서 원하지 않는 텍스처 블렌딩

enter image description here

이 내베이스 텍스처입니다. (256 X 256 픽셀, 32 비트 텍스쳐)

enter image description here

이 내 "ontop의"감촉. (256 X 256 픽셀, 32 비트 텍스쳐)

enter image description here

I 원하는 효과. 투명도가 작동하는 다른 텍스처 ontop을 가진 간단한 기본 텍스처.

enter image description here

그리고 현재의 결과. 텍스처 사이의 블렌딩은 텍스처의 "점"이 조금 더 밝아집니다.

여러 솔루션을 시도했습니다.

 Gdx.gl20.glEnable(Gdx.gl20.GL_BLEND); <-- Doesn't do any difference. 
    Gdx.gl20.glBlendFunc(Gdx.gl20.GL_ONE, Gdx.gl20.GL_ONE_MINUS_SRC_ALPHA); <-- Dosen't do any difference with the cube, but make vertices transparent on a more advanced mesh. 

조각 쉐이더 :

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec2 v_texCoord0; 
uniform sampler2D u_texture1; 
uniform sampler2D u_texture2; 
void main() { 
vec4 bodyColor = texture2D(u_texture1, v_texCoord0); 
vec4 addColor = texture2D(u_texture2, v_texCoord0); 

gl_FragColor = bodyColor + addColor; 
} 

뭔가가 분명히 잘못이 LibGDX의 쉐이더를 구현 내 수업, 렌더러에서입니다.

답변

1

쉐이더 내에서 두 텍스처를 혼합하기 때문에 블렌드 함수는이 작업과 아무 관련이 없습니다.

현재 쉐이더는 두 가지 색상을 추가하기 만합니다. 두 가지 색상을 추가 한 경우 두 번째 색상은 GL_ONE, GL_ONE을 사용합니다.

실제로 두 번째 텍스처가 첫 번째 텍스처를 해당 알파를 기반으로 완전히 바꾸기를 원합니다. 두 개의 메시가 그려진 경우와 같고 두 번째 텍스처는 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA을 사용합니다. 즉, 텍스처 2의 RGB에 알파가 곱해진 반면, 텍스처 1의 RGB에는 (1- 텍스처 2의 알파)가 곱해진다. 그리고 두 결과가 합쳐집니다.

그래서 여러분은 블렌드 함수가했던 것과 같은 방정식을 만들었지 만 이제는 셰이더에서 수행합니다.

gl_FragColor = vec4(bodyColor.rgb*(1.0-addColor.a) + addColor.rgb*addColor.a, 1.0); 

나는 이와 같이 작성할 수도 있다고 생각합니다. 최종 1.0이 출력 알파입니다

gl_FragColor = vec4(mix(bodyColor.rgb, addColor.rgb, addColor.a), 1.0); 

그건 : GPU가 믹스 기능을 최적화 할 수있는 방법이있는 경우 성능은 아마 해당하지만, 가능성이 더 좋다. 최종 결과물에 대해 원하는 결과 알파를 지정하지 않았습니다. 모든 것이 기본 텍스처의 알파를 상속 받기를 원하면 1.0bodyColor.a으로 변경하십시오.

+0

매우 잘 설명 된 답변에 감사드립니다. 나는 알파 값을 가지고이 방법으로 사용해야한다는 것을 몰랐다. 그러나 이것은 내가 많이 도움이되었다! 문제를 해결할뿐만 아니라 GPU와 쉐이더에 대해 더 많이 배울 수 있습니다! 다시 한번 감사드립니다 Tenfour04! – user2774429

관련 문제