在新纹理上剪切具有圆形形状的Direct3D纹理或更改像素的一部分的Alpha值

时间:2015-11-20 11:57:52

标签: textures crop pixel direct3d

您好,对不起我的英语。

我需要剪切/裁剪一个圆形的LPDIRECT3DTEXTURE9。在相同纹理上的新纹理上。

我可以更改每个像素的ARBG值,并使用圆形区域方程将Alpha值更改为外部区域的255(透明)吗?

其他方法是创建一个透明的新纹理,并仅复制我需要的圆形像素。

我怎么不知道我是否解释得很好......

我有这个。 Original Image 而新的纹理必须是这样的 Croped Image 谢谢你

2 个答案:

答案 0 :(得分:1)

这是一个合成/屏蔽问题。您可以在CPU或GPU上执行此操作。

要在CPU上执行此操作,您可以使用IDirect3DTexture9::LockRect直接操作纹理贴图中的像素。

要在GPU上执行此操作,有许多技巧。最简单的可能是将新纹理设置为当前渲染目标,使用模板或alpha缓冲区遮盖圆形区域,然后使用填充渲染目标的四边形将旧纹理绘制到新纹理上。

答案 1 :(得分:0)

如果您已将此纹理加载到LPDIRECT3DTEXTURE9界面,则无法更改它。唯一的方法是通过一些屏幕外操作和着色器创建新的,或者使用带有组合器和一些圆形蒙版的纹理分段(将正确的像素屏蔽为透明)。或者在Photoshop中使用aphamask创建适当的纹理并加载它。

PS。不要忘记按IDirect3DDevice9->SetRenderSate()

启用混合状态

以下是为纹理生成程序掩码的示例。

顶点着色器。

struct VS_INPUT 
{
   float4 Position : POSITION0;

};

struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float2 TexCoord : TEXCOORD0;
   float2 Mask : TEXCOORD1;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;

   Output.Position = Input.Position;
   Output.TexCoord = (Input.Position.xy - 1) * -0.5f;
   Output.Mask = Input.Position.xy;

   return( Output );

}

像素着色器。

struct PS_INPUT 
{
   float2 TexCoord : TEXCOORD0;
   float2 Mask : TEXCOORD1;
};

sampler Texture0;

float4 ps_main(PS_INPUT Input) : COLOR0
{   
   float maskCoef = 0.0f;

   if ((Input.Mask.x * Input.Mask.x + Input.Mask.y * Input.Mask.y) < 1.0f)
   {
      maskCoef = 1.0f;
   } 

   return  maskCoef * tex2D(Texture0, Input.TexCoord);
}

结果将是。

enter image description here

通过将if ((Input.Mask.x * Input.Mask.x + Input.Mask.y * Input.Mask.y) < 1.0f)值替换为较小的1.0f,可以在条件检查0.5f中简单更改圆的大小,例如将减少一半的掩码。