2015-09-09 8 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' 

Vertex код шейдера:

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-го регистра. –