您好,对不起我的英语。
我需要剪切/裁剪一个圆形的LPDIRECT3DTEXTURE9。在相同纹理上的新纹理上。
我可以更改每个像素的ARBG值,并使用圆形区域方程将Alpha值更改为外部区域的255(透明)吗?
其他方法是创建一个透明的新纹理,并仅复制我需要的圆形像素。
我怎么不知道我是否解释得很好......
我有这个。 Original Image 而新的纹理必须是这样的 Croped Image 谢谢你
答案 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);
}
结果将是。
通过将if ((Input.Mask.x * Input.Mask.x + Input.Mask.y * Input.Mask.y) < 1.0f)
值替换为较小的1.0f
,可以在条件检查0.5f
中简单更改圆的大小,例如将减少一半的掩码。