2015-09-09 69 views
0

我想在hlsl中執行漫反射。目前我正在研究頂點着色器。可惜的是我獲得以下錯誤,試圖用fxc.exe編譯時:VertexShader中的「重疊寄存器語義尚未實現」錯誤

C:\Users\BBaczek\Projects\MyApp\VertexShader.vs.hlsl(2,10-25) 
: error X4500: overlapping register semantics not yet implemented 'c1' 
C:\Users\BBaczek\Projects\MyApp\VertexShader.vs.hlsl(2,10-25) 
: error X4500: overlapping register semantics not yet implemented 'c2' 
C:\Users\BBaczek\Projects\MyApp\VertexShader.vs.hlsl(2,10-25) 
: error X4500: overlapping register semantics not yet implemented 'c3' 

頂點着色器代碼:

float4x4 WorldViewProj : register(c0); 
float4x4 inv_world_matrix : register(c1); 
float4 LightAmbient; 
float4 LightPosition; 


struct VertexData 
{ 
    float4 Position : POSITION; 
    float4 Normal : NORMAL; 
    float3 UV : TEXCOORD; 
}; 

struct VertexShaderOutput 
{ 
    float4 Position : POSITION; 
    float3 Color: COLOR; 
}; 

VertexShaderOutput main(VertexData vertex) 
{ 
    VertexShaderOutput output; 


    vertex.Normal = normalize(vertex.Normal); 

    float4 newColor = LightAmbient; 

    vector obj_light = mul(LightPosition, inv_world_matrix); 
    vector LightDir = normalize(obj_light - vertex.Position); 
    float DiffuseAttn = max(0, dot(vertex.Normal, LightDir)); 
    vector light = { 0.8, 0.8, 0.8, 1 }; 
    newColor += light * DiffuseAttn; 

    output.Position = mul(vertex.Position, WorldViewProj); 
    output.Color = float3(newColor.r, newColor.g, newColor.b); 
    return output; 
} 

和命令我用它來進行編譯:

fxc /T vs_2_0 /O3 /Zpr /Fo VertexShader.vs VertexShader.vs.hlsl 

爲什麼我收到這個錯誤?我能做些什麼來防止這種情況發生?

回答

2

找到了它 - 我不刪除這個問題,因爲有人可能會覺得它有用。

你需要做的是改變

float4x4 WorldViewProj : register(c0); 
float4x4 inv_world_matrix : register(c1); 

float4x4 WorldViewProj : register(c0); 
float4x4 inv_world_matrix : register(c4); 

我不知道那是什麼好,但我認爲float4x4是要採取在緩衝更多的空間( 4x4 - 所以需要4個地方)。我認爲這個解釋有點愚蠢,但是它很有效。

+1

這並不是那麼愚蠢。這種情況下的'寄存器'是一個單獨的float4,所以包含float4s的矩陣將消耗4個寄存器。因此,第二個矩陣必須從第5個寄存器開始。 –