2013-12-19 3 views
1

Я, кажется, не могу взломать этот орех сам и после некоторого поиска в Интернете, где я подошел, я подумал, что пришло время обратиться к сообществу, ищущему ответы.Подписчик на полутире в hlsl

У меня есть код в проекте, с которым я работаю, я предоставлю довольно упрощенную версию, но это должно помочь мне показать концепцию.

//hlsl code 
... 
ps_main(...) { 
    half mask = function_calculating_mask_and_returning_half(); 
    half3 color = condition ? a_previously_defined_half3 : mask.rrr; 
} 

Последняя строка здесь это то, что меня смущает, особенно mask.rrr что это реально сделать? Насколько я понимаю, это вернет half3 (mask, mask, mask), но я, похоже, получаю от него действительно высокую ценность, если я его изменю, чтобы сказать mask.r или просто mask, это дает мне результат с гораздо более низкими значениями (насколько я могу судить) ,

Может быть, что-то вроде half3(mask^3, mask^3, mask^3)? Потому что так оно и есть, когда смотришь на результат.

В любом случае, я благодарен за предложения или объяснения относительно того, как работает код и что означает подстрочный код half с .rrr, и любая ссылка на то, какие индексы возможны, будет аккуратным рождественским подарком. : Р

+0

Какова цель вашей модели DX и шейдерной модели? Этот шейдер работает так, как должен? – Netherwire

+0

Я на самом деле немного новичок в 'hlsl' в частности, и рендеринг, использующий его в целом. Но он нацелен на DX9 и выше. Он работает, и, похоже, он делает то, что ожидается, единственное, что этот «цвет» используется на отложенной стадии, чтобы раскрасить зеркальность, и когда я использую 'mask.rrr', я получаю сверхвысокую зеркальность, и именно поэтому я я подозреваю, что 'mask.rrr' делает нечто вроде умножения значения. Поэтому главной недостающей частью является мое понимание индекса 'mask.rrr'. – qrikko

ответ

1

В скалярных типов HLSL, такие как float и half являются одним-мерные векторы, которые имеют только .x (или) .r компонента. Эта подписка обычно используется для типа литья:

float s = .5; 
float3 v1 = s.xxx; // v is (0.5, 0.5, 0.5), or even 
float3 v2 = 0.5.xxx; // :) 

Там также неявное преобразование из векторов в скаляры, что берет первого компонента. Помните, что компоненты хранятся как RGBA (или XYZW):

float3 v = {0.5, 0.6, 0.7} 
float s1 = v; // s1 is 0.5 (implicit conversion) 
float s2 = v.x // s2 is 0.5 (explicit conversion) 
float s3 = v.xxx /* s3 is 0.5 because we've just created float3(v.x, v.x, v.x) 
        and then implicitly taken it's X component, which is v.x */ 

Вот как это работает. Попробуйте изменить код:

half3 color = condition ? a_previously_defined_half3 : half3(mask, mask, mask) 

Ничего не должно измениться.

+0

Вы, конечно, верны, и я рад, что он очищен. Я работал на подобных языках, но далек от эксперта. Поскольку вы, вероятно, подозреваете, что мои результаты вскоре не будут иметь ничего общего с частью '.xxx', но на самом деле это использовало эффектное уравнение, которое, как я думал, не использовалось, поэтому я думаю, что все это сводится к минимуму к моим недостающим знаниям в 'hlsl' в целом наряду с непониманием кода. Я получил его работу, как ожидалось, и я отметил, что ваш ответ решает мой вопрос, потому что теперь я действительно понимаю, как эта часть работает. Благодаря! – qrikko

Смежные вопросы