GPU纹理Splatting

时间:2013-04-24 19:59:42

标签: directx shader textures hlsl alphablending

正如一个简单的例子,我正在尝试执行以下操作:


Dirt + Grass + Alpha = Blended


将第三张图像作为alpha贴图,如何在DX9兼容的像素着色器中实现,以便在前两幅图像之间“混合”,创建类似于第四张图像的效果?
此外,如何将这个新创建的纹理返回到CPU,在那里它可以放回到原始纹理数组中?

1 个答案:

答案 0 :(得分:2)

粗略的方法是将纹理的颜色与alphamap混合,然后从pixelhader返回它:

float alpha = tex2D(AlphaSampler,TexCoord).r;
float3 texture1 = tex2D(Texture1Sampler,TexCoord).rgb;
float3 texture2 = tex2D(Texture2Sampler,TexCoord).rgb;
float3 color = lerp(texture1,texture2,alpha);
return float4(color.rgb,1);

因此,您需要一个纹理作为rendertarget(doc),其大小与inputtextures一样,全屏四边形作为渲染几何体,xyzrhw quad将是最简单的。您可以使用此纹理进一步渲染。如果您想要阅读纹素或其他内容,您必须锁定结果,您可以使用StretchRectdoc)或UpdateSurfacedoc)复制数据进入正常的纹理。

如果性能不重要(例如你预处理纹理),你可以更容易在cpu上计算它(但它更慢)。锁定4个纹理,迭代像素并直接合并它们。

相关问题