Я только начал работать с DirectX, поэтому у меня возникла эта проблема:
Я пытаюсь вставить / отправить / назначить структуру c ++ в / в / с переменной HLSL, которая имеет тот же тип данных, что и структура из C ++.
В C ++:
struct Light
{
Light() {
ZeroMemory(this, sizeof(Light));
}
D3DXVECTOR3 LightPos;
float ID;
};
Light L1;
/.../
ID3D10EffectVariable* L1Var = NULL;
/.../
L1Var = Effect->GetVariableByName("L1")->AsVector();
/.../L1Var->SetRawValue(&L1, 0, sizeof(Light));
Код HLSL:
struct Light {
float3 LightPos;
float ID;
};
Light L1;
Я пытаюсь отправить struct из C ++ в ‘L1’ в HLSL, но я не уверен с правильностью типа L1 в HLSL.
Этот код работает, но я также получаю 0 для целых параметров в L1 … Я не знаю, как это исправить, я в Google 5 часов безрезультатно … Пожалуйста, помогите.
Спасибо за вашу помощь.
Во-первых, если вы новичок в программировании DirectX, я бы предложил не инвестирование в DirectX 10. Вы должны использовать DirectX 11, так как он гораздо лучше поддерживается, имеет гораздо больше релевантного кода утилит и поддерживается на каждой платформе, поддерживающей DirectX 10. Кроме того, вы используете устаревшую математику D3DX, поэтому снова вам обязательно стоит перейти к более современной среде разработки. Существует очень мало причин использовать устаревший DirectX SDK сегодня. Увидеть этот блог а также MSDN для фона здесь. Ты найдешь Набор инструментов DirectX И его учебные пособия хорошая отправная точка. Если вы действительно хотите придерживаться системы эффектов, см. Эффекты 11.
Имейте в виду, что постоянные буферы HLSL используют упаковку и выравнивание немного иначе, чем стандартные структуры C / C ++. Вы получите более интуитивное поведение, если будете придерживаться 4-векторной структуры, где это возможно, вместо использования 3-векторной версии. Теоретически ваши структуры C / C ++ и HLSL представляют собой «совпадение», упаковывающее данные в один 4-векторный вектор, но различные настройки компилятора и правила упаковки могут его отбросить. Увидеть Правила упаковки постоянных переменных. Хороший способ убедиться, что это использовать static_assert
:
static_assert(sizeof(L1) == 16, "CB/struct mismatch");
Проблема, скорее всего, заключается в использовании вами системы эффектов. L1Var
вероятно, фиктивная переменная из-за неудачного поиска, поэтому ваш SetRawValue
не собирается ничего делать Из предоставленного вами фрагмента HLSL мне не ясно, что ваш L1
Переменная HLSL является даже постоянным буфером. Попробуйте отладочный код:
auto tempVar = Effect->GetVariableByName("L1");
if ( tempVar->IsValid() )
{
D3DX10_EFFECT_VARIABLE_DESC desc={0};
tempVar->GetDesc(desc);
OutputDebugStringA(desc.Name); // Set a breakpoint here and look at desc
OutputDebugStringA("\n");
}
else
{
OutputDebugStringA("L1 is not valid!\n");
}
Других решений пока нет …