0
就像一个简单的例子,我想做到以下几点:
+ + = GPU纹理泼洒
随着第三图像作为alpha图,这怎么可能在一个DX9兼容的像素着色器中实现,以便在前两个图像之间“混合”,创建一个类似于第四个图像的效果?
此外,如何将这个新创建的纹理返回给CPU,并将其放回原始纹理数组中?
+ + = GPU纹理泼洒
随着第三图像作为alpha图,这怎么可能在一个DX9兼容的像素着色器中实现,以便在前两个图像之间“混合”,创建一个类似于第四个图像的效果?
此外,如何将这个新创建的纹理返回给CPU,并将其放回原始纹理数组中?
粗糙的方法是用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四边形将是最容易的。这个纹理可以进一步用于渲染。如果你想读纹理或其他东西,你必须锁定结果,你可以使用StretchRect
(doc)或UpdateSurface
(doc)将数据复制到一个正常纹理。
如果性能不重要(例如,预处理纹理),可以更容易地在CPU上计算它(但速度较慢)。锁定4个纹理,迭代像素并直接合并它们。
谢谢!在你的帖子之前我不知道“lerp”,现在我不仅有答案,而且在我的数学库中也有一个新的工具。 – RectangleEquals 2013-04-25 02:29:27