Nano Hash - криптовалюты, майнинг, программирование

Как отразить информацию о членах структуры hlsl?

Используя отражение шейдера в Directx 11, вы можете получить информацию об отдельных переменных, вызвав

myVar = myCbuffer->GetVariableByName/Index  

Но если переменная является объектом структуры, как получить информацию об отдельных членах структуры?
Обратите внимание, что я говорю не о структуре эффектов, а о чистом hlsl и API отражения.


Ответы:


1

Номер члена переменной хранится в описании ее типа. Используйте его для повторения его членов, используя GetMemberTypeByIndex.

Пример:

ID3D11ShaderReflectionConstantBuffer* cb = reflector->GetConstantBufferByIndex( cbIndex );
if ( cb )
{
    D3D11_SHADER_BUFFER_DESC cbDesc;
    cb->GetDesc( &cbDesc );
    if ( cbDesc.Type == D3D11_CT_CBUFFER )
    {
        for ( unsigned i = 0; i < cbDesc.Variables; ++i )
        {
            ID3D11ShaderReflectionVariable* var = cb->GetVariableByIndex( i );

            D3D11_SHADER_VARIABLE_DESC varDesc;
            var->GetDesc( &varDesc );

            ID3D11ShaderReflectionType* type = var->GetType();
            D3D11_SHADER_TYPE_DESC typeDesc;
            type->GetDesc( &typeDesc );

            for ( unsigned j = 0; j < typeDesc.Members; ++j )
            {
                ID3D11ShaderReflectionType* memberType = type->GetMemberTypeByIndex( j );
                D3D11_SHADER_TYPE_DESC memberTypeDesc;
                memberType->GetDesc( &memberTypeDesc );
            }
        }
    }
}
25.07.2013
  • Хорошо, но это не даст мне информацию об имени или размере участника, которая мне понадобится. 29.07.2013
  • GetMemberTypeName() возвращает имя участника. Размер может быть получен из описания типа члена. Самый простой способ — использовать поле Offset. 30.07.2013
  • Я понимаю. Я думал, что он вернул имя типа. Хорошая идея с полем смещения. 30.07.2013

  • 2

    Используйте GetMemberByName ("Если эффект переменная является структурой, используйте этот метод для поиска члена по имени"). Если в структуре есть член "foo", то...

    myCbuffer->GetVariableByName->GetMemberByName("foo")
    
    24.07.2013
  • По какой-то причине функция GetMemberByName недоступна в API отражения. (Я отредактировал свой вопрос, чтобы уточнить, о чем я говорю.) 24.07.2013

  • 3

    Вы могли бы использовать

    ID3D11ShaderReflectionType::GetMemberTypeName 
    

    Эта функция возвращает имя члена поля структуры в CBuffer. Я сталкиваюсь с тем же вопросом при разработке моей программы рефлексии HLSL. Эту функцию я пробовал сам и получил правильный результат.

    07.02.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..