HLSL получава стойности от позицията на текстурата

Картографирах някои стойности в моята текстура на моя алфа канал. Всъщност използвам моята текстура като 2Darray. Това, от което се нуждая, е начин да прочета алфа стойността на картата на позиция, напр. [4][5] (представляващи x и y)

Имам нужда от върнатата стойност, налична в моя pixelshader. Има ли начин това да стане?

Използвам DX9.

Thx предварително!


person marius    schedule 22.10.2012    source източник


Отговори (2)


Искате ли да използвате тексела в [4][5] (x,y) за целия ви пикселен шейдър? ако това е вашият въпрос, можете просто да изчислите предварително тази кордината на върховия шейдър и да преминете към всеки връх и след това да вземете проба с тези uv кабели. по този начин няма да се интерполира. (или ще, но ще има само една стойност за интерполиране)

освен това вероятно трябва да уточните малко повече за това, което се опитвате да постигнете. За какво го използвате? кога ще се случи, за какъв вид мрежа го използвате?

person Tordin    schedule 22.10.2012
comment
Просто искам да го имам за изчисления. Сякаш изпълнявам алгоритъм върху всяко пикселно изчисление на x и y координатите и получавам алфа стойностите от тази текстура в координатите. Това трябва да е възможно. Мисля, че това е наистина лесно за решаване. - person marius; 22.10.2012
comment
Имате предвид просто текстуриране с правилните UV кабели на многоъгълник? можете просто да предадете UV от върха, ако това е така. - person Tordin; 22.10.2012
comment
Не, не искам да текстурирам своя полигон. Тази текстура не е за текстуриране! Създаден е отвън и има само някои фалшиви стойности, които трябва да прочета като 2D-масив. Наистина просто искам да го използвам като 'texture[x][y].alpha'. Изчислих x и y... това не би трябвало да е толкова трудно?! - person marius; 22.10.2012
comment
добре, ако е в обикновен масив, тогава е нещо като for(int h = 0; h‹HEIGTH; ++h) { for(int w = 0; w‹WDITH; ++w) { pixel[w] [h] = пиксел [(h * WIDTH) + w]; }} - person Tordin; 22.10.2012
comment
Все още греша, не искам да минавам през всички пиксели на текстурата.. ето малко код texture lightMap; float4 PixelShaderMain(...) { ... float lightIntensity = getLightIntensity(angles); ... } float getLightIntensity(float2 angles) { int x = (int)((float)dimX*(angles.x/360)); int y = (int)((float)dimY*(angles.y/90)); return lightMap[y][x].alpha; } - person marius; 22.10.2012
comment
стойностите за текстура lightMap се задават отвън (при инициализиране) - person marius; 22.10.2012
comment
не знам дали това наистина е правилен синтаксис. и освен това, в текскоордите на pixelshader, той не варира от 0-›W, а от 0-›1. не знам дали това помага. - person Tordin; 22.10.2012
comment
Мисля, че имам друг проблем. Трябва да навляза още малко в HLSL, преди да направя това. Благодаря ти все пак :) - person marius; 22.10.2012
comment
Намерих решение за това, ето отговора, който получих: Трябва да декларирате текстура и инструмент за вземане на проби от текстури в началото на вашия шейдър (преди функциите). текстура2D текстура1; sampler2D myTexture1Sampler = sampler_state { Texture = ‹texture1›; MinFilter = ЛИНЕЕН; MagFilter = ЛИНЕЕН; MipFilter = ЛИНЕЕН; };Тогава можете да получите достъп до стойностите на пикселите на вашата текстура чрез специална функция: float4 textureColor = tex2D(myTexture1Sampler, float2(u,v)); textureColor.r; textureColor.g; textureColor.b; textureColor.a; - person marius; 22.10.2012

Texture2DArray е шейдър модел 4 нещо. Не вярвам да го използвате на dx9.

Ако използвате шейдър модел 4, тогава просто използвайте функцията Load(4, 5).

В противен случай за sm1,2,3 можете да поставите числата, които искате, напр. 4.0f и 5.0 във вашия връх като нормални texcoord данни. След това накарайте пикселния шейдър да го мащабира според размера на текстурата.

struct VertexInput {
    float4 pos : POSITION;
    float2 uv : TEXCOORD0; //0.0, 1.0, 2.0, 3.0, 4.0 etc
};

struct PixelInput {
    float4  position : POSITION;
    float2  uv : TEXCOORD0;
};

PixelInput vsTex(VertexInput vtx) 
{
    PixelInput output;
    float4 pos = vtx.pos;
    output.position = mul(pos, MatWorld);
    output.position = mul(output.position, MatView);
    output.position = mul(output.position, MatProj);

    output.uv = vtx.uv;

    return output;
}

float4 PixelShader(PixelInput input) : SV_Target
{
    float coords = pix.uv / float2(TEX_WIDTH, TEX_HEIGHT);
    return tex = tex2D(mySampler, coords);
}

Където TEX_WIDTH, TEX_HEIGHT се предават чрез параметъра 'defines' на D3DXCompileShader. И

ИЛИ: просто направете 4.0f/tex_width и 5.0/tex_height в софтуера и просто предайте това число (което ще бъде между [0.0f,1.0f] до пикселния шейдър)

person Pod    schedule 23.10.2012