我正在尝试将一些图像插值算法移植到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,但我真的不明白他对这个问题的解决方法,移植它会让人痛苦......
维基百科讲述了一种物质方法。所以我的问题是:我在哪里可以找到易于移植的图形开源库,其中包括简单的缩放算法?当然,如果这样的图书馆甚至存在:)
答案 0 :(得分:1)
问题在于着色器是一个功能域。您所指的大多数算法都是用常规语言完成的,因此它们不会很容易移植。
你可以通过在matlab这样的东西中查看最近邻图像大小调整功能来找到一些很棒的信息...例如在这个问题中: Nearest-neighbor interpolation algorithm in MATLAB