Войти
ПрограммированиеФорумГрафика

Программирование шейдеров на HLSL. (Комментарии к статье) (9 стр)

Страницы: 15 6 7 8 9 10 Следующая »
#120
23:46, 27 окт. 2010

mehoz
Вообще порядок умножения матриц играет очень важную роль, а не только вида и проекции...


#121
8:39, 28 окт. 2010

EvgenLog,
посмотри Microsoft DirectX SDK.
Там всё это есть.

#122
10:27, 31 окт. 2010

Che@ter
да, я понимаю, просто когда первый раз прикручивал шейдер как то забыл об этом.

Прошло более 1 года
#123
0:27, 1 сен. 2012

Доброго дня.
К теме Specular Bump Mapping
Непростая тема, и написана довольно подробно, но...
Для меня осталось пару немонятных моментов. Жалко автор не показал текстуру Bump, которую он использовал.
В принципе, если есть Normal map (RGB текстура, выглядит как правило с преобладанием синего цвета) положенная на геометрию (т.е. текстурные координаты тоже есть), то TBN space не нужен.
Почему? Потому что в пиксельном шейдере мы самплаем нашу Normal map в данном пикселе и корректируем нашу нормаль на это значение.
В приведенном примере, насколько я понимаю, простой Rectangle, т.е. текстурные координаты даже можно вручную задать.
Сложнее, скажем со сферой испещренной царапинами. Для этого нужно делать Render to texture, например, в 3ds max, texture в данном случае и будет Normal map.
TBN space нужен в том случае, если вместо Normal map используется некоторая текстура, в двух каналах которой хранится градиент высоты (автор упоминал height map) по X и Y на канал соответственно. Естественно, нормаль будет наклоняться в сторону этого градиента. НО! Это происходит в image space. А геометрия с этим рисунком может быть ориентированна уже произвольно. Т.е. мы не знаем как нормаль наклоняется в пространстве! Для этого и нужен TBN space, показанный у автора. Другими словами умножение TBN матрицы на нетрансформированную нормаль (мы говорили о произвольной ориентации геометрии) трансформирует эту нормаль в мировое пространство. Ну а там уже и расчет освечения.

Прошло более 1 года
#124
18:35, 20 янв. 2014

Эта статья не расказывает возможно ли такое(например):

// Приложение.cpp
struct DummyPoint
{
   D3DXVECTOR3 pos;
   int num;
};
DummyPoint allPoint[32];
ConstantTable->SetValue(Device, "allPoint", allPoint, sizeof(allPoint) * 32);
Теперь
// Вершинный шейдер
struct DummyPoint
{
   float3 pos;
   int num;
};
DummyPoint allPoint[32];

float4 Main(/*...*/) : COLOR0
{
  // Использование allPoint
}

Возможно ли так? Чтобы переменные сидели в домике, без такой расчленёнки allPoint[32] в шейдере:

// DummyPoint [32]
float3 pos[32];
int    num[32];

#125
18:47, 20 янв. 2014

А к  тому же если будет не

int num
а
char num
Что теперь всё приложение перекраивать ради шейдера? Или лишнюю структуру создавать...

#126
19:45, 20 янв. 2014

Замени int на float4. float3 тоже на float4.

#127
21:37, 20 янв. 2014

Проверил на практике - это работает. И я даже "усугубил" ситуацию и добавил в структуру конструктор и деструктор и работает. Выходит можно передовать свою структуру в шейдер.

Wraith
> Замени int на float4. float3 тоже на float4.
И так попробовал - идентичный результат! Это что же получается всё "восприятие мира" рушится сног на голову. Размерность данных(я про байты) вообще до фонаря, получается данные передаются
поштучно в порядке объявления в структуре.
Но тогда смысл декларации вершины (в d3d)? Смысл декларации - только указать что является цветом, а что текстурными координатами? Но в декларации надо указывать и байтики смещения, что-то здесь не так...

#128
21:56, 20 янв. 2014

Ааа, чтобы "шейдер" разобрал буфер вершин на поштучно(поатрибутно) и усадил данные правильно на свои места в свою структуру вершины для этого нужно указывать смещение каждого атрибута при декларации. По моему логичное заключение.

#129
23:32, 20 янв. 2014

Жаберштуцер
> И так попробовал - идентичный результат! Это что же получается всё "восприятие
> мира" рушится сног на голову. Размерность данных(я про байты) вообще до фонаря,
> получается данные передаются
У себя в структуре тоже замени. Еще лучше - запакуй num в pos.w.
Инты нельзя мешать с флоатами в структурах потому что инты идут в отдельный файл регистров.
Вообще, в д3д9 самый лучший способ передачи параметров - это сделать две-три структуры, тупо привязать их к конкретным регистрам и отправлять целиком через SetxxxShaderConstantF(). Структуру инклудить и в С++ и в .hlsl, чтоб прямо 1 в 1. Только поля в структуре должны быть кратны float4, иначе alignment разойдется.

Кому сдался этот рефлекшен.

Инты сами по себе - хз, они нужны только если у тебя циклы в шейдерах и ты хочешь разное количество итераций.

#130
23:44, 20 янв. 2014

Wraith
> Кому сдался этот рефлекшен.

Как тебе сказать - хардкорная привязка к регистрам хороша, пока пишешь сам :) Как только задача стоит сделать как можно гибче, желания разные появляются

> Инты сами по себе - хз, они нужны только если

Смещения вертексных констант ?

#131
1:53, 21 янв. 2014

innuendo
> Смещения вертексных констант ?
Нет инструкции на загрузку адресного регистра из инта.

#132
5:22, 21 янв. 2014

Wraith
> Нет инструкции на загрузку адресного регистра из инта.

Да, действительно - только loop и rep. Посыплю голову пеплом :)

С другой стороны

http://msdn.microsoft.com/ru-ru/library/windows/apps/bb174716.aspx

опосредованно можно - так что рано голову пеплом сыпать :)

#133
20:55, 21 янв. 2014

Wraith
> в д3д9 самый лучший способ передачи параметров - это сделать две-три структуры
то есть поделить структуру на меньшие структуры по типам - одна для флоатов, другая для интов? Не удобно.
И ещё это:

HRESULT SetVertexShaderConstantI(
  [in]  UINT StartRegister,
  [in]  const int *pConstantData,
  [in]  UINT Vector4iCount
);
StartRegister - где мне взять? Я в ассемблере полный тупак.
Wraith
> Инты нельзя мешать с флоатами в структурах потому что инты идут в отдельный
> файл регистров.
Поверю наслово, потому что нечего возразить. Значит операция (int)float - в шейдере, предпочтительнее чем передача int (не через SetVertexShaderConstantI).
#134
21:24, 21 янв. 2014

Жаберштуцер
> то есть поделить структуру на меньшие структуры по типам - одна для флоатов,
> другая для интов? Не удобно.
Нет. Это значит - собрать вообще все свои параметры какие у тебя есть в две-три структуры (например, по частоте заливки: в одной worldviewproj, еще какие-то per-object данные, в другую - все параметры материала), и заливать не по одной, а целиком структуру.

От интов вообще избавиться, потому что ими просто нечего делать в шейдере - у них очень специализированное назначение, просто так для них нет инструкций. (int)float не делает из числа целое, он просто отбрасывает дробную часть.

> StartRegister - где мне взять? Я в ассемблере полный тупак.
Вилочкой ее, вилочкой:

float4x4 worldViewProj : register(c0)

Короче - смотри дизасм своего шейдера, вдумчиво читай документацию про инструкции и просветляйся.

Страницы: 15 6 7 8 9 10 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.