2011-08-26 5 views
1

하나의 조각에 3 개의 다른 텍스처를 혼합하여 똑같이 보간 할 수 있기를 바랍니다.GLSL (webgl)에서 하나의 조각으로 3 개의 텍스처 보간

검은 색과 흰색의 그라디언트 인 세 번째 텍스처 (textureColor3)를 사용하여 조각 전체에서 혼합되는 두 개의 텍스처 (textureColor1, textureColor2)를 얻을 수있었습니다. 세 가지 텍스처와 비슷한 것을하고 싶습니다만 다른 텍스처를 마스크로 포함하지 않아도 세 텍스처를 보간 할 수 있다면 좋을 것입니다. 어떤 도움이라도 대단히 감사합니다.

vec4 textureColor1 = texture2D(uSampler, vec2(vTextureCoord1.s, vTextureCoord1.t)); 
vec4 textureColor2 = texture2D(uSampler2, vec2(vTextureCoord2.s, vTextureCoord2.t)); 
vec4 textureColor3 = texture2D(uSampler3, vec2(vTextureCoord1.s, vTextureCoord1.t)); 
vec4 finalColor = mix(textureColor2, textureColor1, textureColor3.a); 
+1

그것은 당신이 달성하려고하는 무엇인지 전혀 분명하지 않다. 세 텍스처가 "똑같이 섞이도 록"라고 말하면 무엇을 의미합니까? –

+0

왜 모든 textureColorX를 3으로 나누고 그 값을 더할 수 없습니까? 또는 원하는 "보간 알고리즘"을 직접 입력하십시오. –

+0

도움을 주셔서 감사합니다! 셰이더가 각 꼭지점에 할당 된 세 가지 다른 색상을 보간하는 방법도 마찬가지로 세 가지 텍스처를 혼합하기를 바랬습니다. 현재 나는 알파를 기반으로 텍스쳐를 혼합 한 알고리즘을 작성했습니다. 나는 위에서 언급 한 것처럼 그들을 보간하기 위해 그것을 찾고있었습니다. –

답변

3

당신이 그들 모두가 당신이 단순히 같은 것을 할 수있는, 동등하게 혼합 할 경우 당신은 또한 수레로 질감의 무게에 전달할 수

finalColor.x = (textureColor1.x + textureColor2.x + textureColor3.x)/3.0; 
finalColor.y = (textureColor1.y + textureColor2.y + textureColor3.y)/3.0; 
finalColor.z = (textureColor1.z + textureColor2.z + textureColor3.z)/3.0; 

합니다. 예를 들어 Texture1의 가중치는 0.5, Texture2의 가중치는 0.3, Texture3의 가중치는 0.2입니다. 가중치가 1.0이되는 한 텍스처 값으로 간단히 곱하면됩니다. weighted average을 찾는 것과 같습니다.

+0

가중치를 사용하면 달성하고자하는 목표에 더 가까워 지겠지만 조각 전체에 일부 블렌딩이 필요하다고 생각합니다. 여기에 표시된 삼각형 (하나의 단편)과 유사 : [http://learningwebgl.com/blog/?p=134] –

+0

아, 그러면 기본적으로 그라디언트가 다른 여러 픽셀에서 서로 다른 가중치를 사용하고 싶습니까? 정점 속성으로 가중치를 저장하면 픽셀 쉐이더로 그 값을 전달할 수 있습니다. 유일한 옵션은 기존 텍스처의 알파 채널에 가중치를 저장하거나 다른 텍스처를 추가하는 것이지만 각 픽셀의 가중치를 제어하려는 경우입니다. 투명도를 위해 알파가 필요하지 않은 경우 알파 채널을 사용하는 것이 더 좋은 옵션입니다. – TaylorP

+0

의미가 있습니다. 감사합니다. 알파 채널에 가중치를 저장하는 방법을 고수 할 것입니다. 이해하기 쉽고 텍스쳐를 다양하게 할 수 있습니다 ... 또한 셰이더 코드를 단순화합니다 :'vec4 textureColor1 = texture2D (uSampler, vec2 (vTextureCoord1.s, vTextureCoord1.t)); \t vec4 textureColor2 = texture2D (uSampler, vec2 (vTextureCoord2.s, vTextureCoord2.t)); \t \t vec4 finalColor = mix (textureColor2, textureColor1, textureColor1.a);' –

0

보간 3 개 텍스처를 사용하여 무게 :

은 각 텍스처 유형
0에서 1로 무게를 가지고 그리고 당신은 정규화 된 가중치를 가지고 가정 - 그래서 그들은으로 VEC3로 합의에
그리고 입력 가중치를 1과 동일 쉐이더는

varying/uniform/... vec3 weights; 
main { 
resultColor.x = (texel0.x * weights.x + texel1.x * weights.y + texel2.x * weights.z); 
resultColor.y = (texel0.y * weights.x + texel1.y * weights.y + texel2.y * weights.z); 
resultColor.z = (texel0.z * weights.x + texel1.z * weights.y + texel2.z * weights.z); 
... 
} 
관련 문제