2013-04-24 62 views
0

就像一个简单的例子,我想做到以下几点:


Dirt + Grass + Alpha = BlendedGPU纹理泼洒


随着第三图像作为alpha图,这怎么可能在一个DX9兼容的像素着色器中实现,以便在前两个图像之间“混合”,创建一个类似于第四个图像的效果?
此外,如何将这个新创建的纹理返回给CPU,并将其放回原始纹理数组中?

回答

2

粗糙的方法是用alpha贴图混合纹理的颜色,并从pixelshader返回它:

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); 

因此,你需要一个纹理渲染目标(doc)与inputtextures的大小和全屏四边形作为渲染的几何图形,xyzrhw四边形将是最容易的。这个纹理可以进一步用于渲染。如果你想读纹理或其他东西,你必须锁定结果,你可以使用StretchRectdoc)或UpdateSurfacedoc)将数据复制到一个正常纹理。

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

+0

谢谢!在你的帖子之前我不知道“lerp”,现在我不仅有答案,而且在我的数学库中也有一个新的工具。 – RectangleEquals 2013-04-25 02:29:27