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

Я сопоставил некоторые значения с моей текстурой на моем альфа-канале. На самом деле я использую свою текстуру как 2Darray. Мне нужен способ прочитать альфа-значение карты в позиции, например. [4][5] (представляющие x и y)

Мне нужно возвращаемое значение, доступное в моем пиксельном шейдере. Есть какой-либо способ сделать это?

Я использую DX9.

Спасибо заранее!


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


Ответы (2)


Вы хотите использовать тексель в [4][5] (x,y) для всего вашего пиксельного шейдера? если это ваш вопрос, вы можете просто предварительно вычислить эту координату в вершинном шейдере и передать ее каждой вершине, а затем выполнить выборку с помощью этих УФ-кордов. таким образом, он не будет интерполирован. (или будет, но для интерполяции будет только одно значение)

помимо этого вам, вероятно, придется немного больше указать, чего вы пытаетесь достичь. Для чего вы его используете? когда это произойдет, для какой сетки вы ее используете?

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
я не знаю, правильно ли это синтаксис. и кроме того, в texcoords пиксельных шейдеров он колеблется не от 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›; МинФильтр = ЛИНЕЙНЫЙ; MagFilter = ЛИНЕЙНЫЙ; МипФильтр = ЛИНЕЙНЫЙ; }; Затем вы можете получить доступ к значениям пикселей вашей текстуры с помощью специальной функции: float4 textureColor = tex2D(myTexture1Sampler, float2(u,v)); текстураЦвет.r; текстураЦвет.g; текстураЦвет.b; текстураЦвет.а; - 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 передаются через параметр «определяет» D3DXCompileShader. И

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

person Pod    schedule 23.10.2012