非方形径向渐变图像生成
Non Square Radial Gradient Image Generation
我正在 Unity 中创建一个函数,用允许水平、垂直、对角线和径向方向的渐变填充纹理。前三个很简单,并且适用于矩形图像,但是,我能找到的唯一用于径向渐变的算法取决于方形图像,如下所示:
Vector2 center = new Vector2 ( texture.width * 0.5f, texture.height * 0.5f );
for ( int y = 0; y < texture.height; y++ )
{
for ( int x = 0; x < texture.width; x++ )
{
float distanceFromCenter = Vector2.Distance ( center, new Vector2 ( x, y ) );
float t = invert ? 1 - ( 0.5f - ( distanceFromCenter / texture.width ) ) : 0.5f - ( distanceFromCenter / texture.width );
texture.SetPixel ( x, y, gradient.Evaluate ( t ) );
}
}
如何使其适用于矩形图像?
问题出在 texture.width 的除法上。对于方形纹理,这并不重要,因为它的高度和宽度都是相同的长度。
您需要将当前点除以纹理的尺寸。这将为您提供介于 0 和 1 之间的 x 和 y 值。
Vector2 relativePoint = new Vector2 ( x / texture.width, y / texture.height );
接下来,获取新中心点(0.5, 0.5)和这个新点之间的距离,给你在点(x, y)处的中心采样值。
float centeredPointSampleValue = 0.5f - Vector2.Distance ( new Vector2(0.5, 0.5), relativePoint );
并将它们放在一起:
for ( int y = 0; y < texture.height; y++ )
{
for ( int x = 0; x < texture.width; x++ )
{
Vector2 relativePoint = new Vector2 ( x / texture.width, y / texture.height );
float centeredPointSampleValue = 0.5f - Vector2.Distance ( new Vector2( 0.5, 0.5 ), relativePoint );
float t = invert ? 1 - centeredPointSampleValue : centeredPointSampleValue ;
texture.SetPixel ( x, y, gradient.Evaluate ( t ) );
}
}
我正在 Unity 中创建一个函数,用允许水平、垂直、对角线和径向方向的渐变填充纹理。前三个很简单,并且适用于矩形图像,但是,我能找到的唯一用于径向渐变的算法取决于方形图像,如下所示:
Vector2 center = new Vector2 ( texture.width * 0.5f, texture.height * 0.5f );
for ( int y = 0; y < texture.height; y++ )
{
for ( int x = 0; x < texture.width; x++ )
{
float distanceFromCenter = Vector2.Distance ( center, new Vector2 ( x, y ) );
float t = invert ? 1 - ( 0.5f - ( distanceFromCenter / texture.width ) ) : 0.5f - ( distanceFromCenter / texture.width );
texture.SetPixel ( x, y, gradient.Evaluate ( t ) );
}
}
如何使其适用于矩形图像?
问题出在 texture.width 的除法上。对于方形纹理,这并不重要,因为它的高度和宽度都是相同的长度。
您需要将当前点除以纹理的尺寸。这将为您提供介于 0 和 1 之间的 x 和 y 值。
Vector2 relativePoint = new Vector2 ( x / texture.width, y / texture.height );
接下来,获取新中心点(0.5, 0.5)和这个新点之间的距离,给你在点(x, y)处的中心采样值。
float centeredPointSampleValue = 0.5f - Vector2.Distance ( new Vector2(0.5, 0.5), relativePoint );
并将它们放在一起:
for ( int y = 0; y < texture.height; y++ )
{
for ( int x = 0; x < texture.width; x++ )
{
Vector2 relativePoint = new Vector2 ( x / texture.width, y / texture.height );
float centeredPointSampleValue = 0.5f - Vector2.Distance ( new Vector2( 0.5, 0.5 ), relativePoint );
float t = invert ? 1 - centeredPointSampleValue : centeredPointSampleValue ;
texture.SetPixel ( x, y, gradient.Evaluate ( t ) );
}
}