0

我正在尝试将一些图像插值算法移植到 HLSL 代码中,现在我得到了:

float2   texSize;
float   scale;
int method;

sampler TextureSampler : register(s0);


float4 PixelShader(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 
{ 
float2 newTexSize = texSize * scale;
float4 tex2;

if(texCoord[0] * texSize[0] > newTexSize[0] ||
texCoord[1] * texSize[1] > newTexSize[1])
{
tex2 = float4( 0, 0, 0, 0 );
    
} else {
if (method == 0) {
        tex2 = tex2D(TextureSampler, float2(texCoord[0]/scale, texCoord[1]/scale));
    } else {
        float2 step = float2(1/texSize[0], 1/texSize[1]);

        float4 px1 = tex2D(TextureSampler, float2(texCoord[0]/scale-step[0], texCoord[1]/scale-step[1]));
        float4 px2 = tex2D(TextureSampler, float2(texCoord[0]/scale        , texCoord[1]/scale-step[1]));
        float4 px3 = tex2D(TextureSampler, float2(texCoord[0]/scale+step[0], texCoord[1]/scale-step[1]));
        float4 px4 = tex2D(TextureSampler, float2(texCoord[0]/scale-step[0], texCoord[1]/scale        ));
        float4 px5 = tex2D(TextureSampler, float2(texCoord[0]/scale+step[0], texCoord[1]/scale        ));
        float4 px6 = tex2D(TextureSampler, float2(texCoord[0]/scale-step[0], texCoord[1]/scale+step[1]));
        float4 px7 = tex2D(TextureSampler, float2(texCoord[0]/scale        , texCoord[1]/scale+step[1]));
        float4 px8 = tex2D(TextureSampler, float2(texCoord[0]/scale+step[0], texCoord[1]/scale+step[1]));
        tex2 = (px1+px2+px3+px4+px5+px6+px7+px8)/8;
        tex2.a = 1; 
        
    }
}
return tex2; 
} 


technique Resample
{ 
pass Pass1 
{ 
    PixelShader = compile ps_2_0 PixelShader(); 
} 
} 

问题是编程像素着色器需要不同的方法,因为我们无法控制当前位置,只有实际循环通过像素的“内部”部分。

我已经用谷歌搜索了大约一整天,发现没有一个开源库在循环中使用了缩放算法。是否有这样的库,我可以从中移植一些方法?

我找到了http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx但我真的不明白他解决问题的方法,移植它会很痛苦......

维基百科讲述了一种数学方法。所以我的问题是:我在哪里可以找到包含简单缩放算法的易于移植的图形开源库?当然,如果这样的库甚至存在的话。

4

1 回答 1

1

问题是着色器是一个功能域。您所指的大多数算法都是用常规语言完成的,因此它们不会很容易移植。

您可以通过查看 matlab 之类的最近邻图像大小调整函数来找到一些重要信息......例如在这个 SO 问题
中:MATLAB 中的最近邻插值算法

于 2010-05-05T14:22:34.637 回答