2015-05-20 3 views
2

Как я могу сделать глобальную переменную texture3d, которую я могу изменить в геометрическом шейдере (HLSL)?Изменить глобальную переменную texture3d в HLSL

Размер будет 64x64x64.

Я бы заполнил его один раз в первом окне рендеринга и использовал его во втором рендере.

Любая помощь приветствуется. Предпочтительно использовать D10.

EDIT:

Я сделать походный куб местности шейдер следуя http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html руководство (см пункт 1.4). Я получил геометрический шейдер, это просто, что у меня нет нормалей, и руководство предлагает, чтобы я мог создавать их, сохраняя данные в texture3D, но я не знаю, как я могу поместить данные в texture3D. (Руководство использует DX10).

+0

Возможно, это поможет, версия GS должна работать и в DX10, а http://stackoverflow.com/questions/29124668/rendering-to-a-full-3d-render-target-in-one-pass/29544276 # 29544276 – catflier

+0

Да, это именно то, что мне нужно. Спасибо чувак. – MrEpicosity

ответ

2

Возможно, вы думаете о вычислительном шейдере. В этом случае вы должны объявить свою текстуру как RWTexture3D в вычислительном шейдере, а затем пробовать ее в вашем рендеринге как Texture3D. В Интернете есть много ресурсов/учебных пособий/примеров о вычислительных шейдерах, которые помогут вам начать работу.

Вы не можете изменять текстуры с помощью геометрического шейдера в D3D11. Единственное, что может сделать geometry shader, это генерировать примитивы. Однако, поскольку ответы @Adam Miles отвечают, можно записать RWTexture3D в геометрический шейдер в D3D11.1. Хотя это возможно, если вы также не генерируете примитивы с вашим шейдером геометрии, вероятно, имеет смысл сделать это в вычислительном шейдере.

Если вы работаете в D3D 10.x через D3D11 API, вы все равно можете использовать compute shaders, хотя вы не можете использовать тип RWTexture3D. Вам нужно будет просмотреть его как RWByteAddressBuffer и проиндексировать его самостоятельно, что было бы немного неудобно. Вам необязательно создавать текстурные данные в шейдере, вы можете писать текстуру с помощью ЦП, путем сопоставления и непосредственного написания данных. См. ID3D10Texture3D::Map для получения дополнительной информации.

+0

Спасибо за ваш ответ, но нет ли способа сделать это в directx10? Я делаю маршевый шейдер для кубического куба, следуя этому руководству http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html (см. Пункт 1.4). Я получил геометрический шейдер, это просто, что у меня нет нормалей, и руководство предлагает, чтобы я мог создавать их, сохраняя данные в texture3D, но я не знаю, как я могу поместить данные в texture3D. (Руководство также использует DX10). – MrEpicosity

0

Если вы хотите поддерживать карты Direct3D 11.1 и выше, то может достичь того, что вы просите, используя RWTexture3D, в отличие от другого ответа.

Вы можете привязать 64x64x64 RWTexture3D к шагу Geometry Shader и записать его так же, как и в Compute Shader.

См. Use UAVs at every pipeline stage, что возможно.

+0

Спасибо за ваш ответ, но нет ли способа сделать это в directx10? Я делаю маршевый шейдер для кубического куба, следуя этому руководству http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html (см. Пункт 1.4). Я получил геометрический шейдер, это просто, что у меня нет нормалей, и руководство предлагает, чтобы я мог создавать их, сохраняя данные в texture3D, но я не знаю, как я могу поместить данные в texture3D. (Руководство также использует DX10). – MrEpicosity