2013-12-19 46 views
1

我似乎無法自己破解這個螺母,並且在我找到空白處的一些Google搜索之後,我認爲該是轉向社區尋找答案的時候了。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)?因爲這就是看結果時的樣子。

無論如何,我很感激關於代碼如何工作的建議或解釋,以及如何使用.rrr下標half以及任何可能的下標可能是聖誕禮物。 :P

+0

你的目標DX和着色器模型版本是什麼?這個着色器的工作原理應該如何? – Netherwire

+0

我實際上對'hlsl'特別有點新,而渲染器一般都在使用它。但它的目標是DX9以上。它確實起作用,並且它似乎完成了預期的任務,唯一的一點是,這個'color'在延遲階段用於着色鏡面反射,當我使用'mask.rrr'時,我得到了超高鏡面度,這就是爲什麼我我懷疑'mask.rrr'做了一些值的乘法。所以主要的失敗部分是我對'mask.rrr'下標的理解。 – qrikko

回答

1

在HLSL標量類型如floathalf是具有唯一.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