Назначить структуру C ++ с переменной HLSL

Я только начал работать с 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 часов безрезультатно … Пожалуйста, помогите.

Спасибо за вашу помощь.

0

Решение

Во-первых, если вы новичок в программировании 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");
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector