HLSL, программный пиксельный шейдер с различными алгоритмами уменьшения масштаба изображения Texture2D - PullRequest
0 голосов
/ 01 мая 2010

Я пытаюсь перенести некоторые алгоритмы интерполяции изображений в код 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, но я действительно не понимаю Его подхода к проблеме, и портирование этого будет болью в ...

Википедия рассказывает о математическом подходе. Итак, мой вопрос: где я могу найти простую в портировании графическую библиотеку с открытым исходным кодом, которая включает в себя простые алгоритмы масштабирования? Конечно, если такая библиотека вообще существует :)

1 Ответ

1 голос
/ 05 мая 2010

Проблема в том, что шейдеры являются функциональным доменом. Большинство алгоритмов, на которые вы ссылаетесь, сделаны на обычных языках, поэтому они не очень легко переносятся.

Вы можете найти отличную информацию, посмотрев функции изменения размера изображения ближайшего соседа в таких вещах, как matlab ... например, в этом вопросе SO: Алгоритм интерполяции ближайшего соседа в MATLAB

...