Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2013, 21:44   #1
Inv1s
Форумчанин
 
Аватар для Inv1s
 
Регистрация: 06.11.2011
Сообщений: 214
По умолчанию DirectX 10

Добрый вечер.


При изучении возник один вопрос, как передать константный буфер в шейдер. (sharpDX, C# + directX10 + shader4.0)

В примере нашел следующее.

в программе
Код:
// Create Constant Buffer
var constantBuffer = new Buffer(_device, Utilities.SizeOf<Matrix>(), 
                        ResourceUsage.Default, BindFlags.ConstantBuffer, 
                        CpuAccessFlags.None, ResourceOptionFlags.None);
....
_device.PixelShader.SetConstantBuffer(0, constantBuffer );
в шейдере есть
Код:
float4x4 worldViewProj;
почитав msdn видимо надо изменить на
Код:
cbuffer ConstantBuffer : register( b0 )
{   float4x4 worldViewProj;   }
Но, я не понимаю, где задаются значения и как он вообще работает.
На msdn описывается также, создаем буфер и отправляем, а с какими значениями не известно.
Где и как задать матрицу и другие параметры?

P.S. Если отнес не к той теме, извиняюсь.
Помог, нажми на весы
html, js, php, С++, С#, OpenGl, DirectX, XNA, HLSL
Inv1s вне форума Ответить с цитированием
Старый 05.08.2013, 19:23   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
в шейдере есть
Код:

float4x4 worldViewProj;

почитав msdn видимо надо изменить на
Код:

cbuffer ConstantBuffer : register( b0 )
{ float4x4 worldViewProj; }
Не обязательно. Все константы вне явного буфера неявно находятся в буфере №0.

Вы создаёте объект буфера, так как вы привели выше.
Создаёте структуру, в которой храните данные, например
Код:
struct BufferData
{
public Matrix M;
};
Тут предполагается, что каждому cbuffer в коде шейдера соответствует свой буфер DirectX, и соответственно, своя managed-структура.
Далее средствами SharpDX (не знаю точно какими, работал со slimdx, там это делается класом DataStream) перегоняете данные из этой структуры в подготовленный буфер (тот что вы привели выше). Дальше устанавливаете буфер шейдеру, как вы опять же написали.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 06.08.2013, 07:42   #3
Inv1s
Форумчанин
 
Аватар для Inv1s
 
Регистрация: 06.11.2011
Сообщений: 214
По умолчанию

Сделал немножко по другому

Код:
 var constantBuffer = Buffer.Create(_device, BindFlags.ConstantBuffer, new[]
                {
                    new Matrix(1,0,0,0,
                               0,1,0,0,
                               0,0,1,0,
                               0,0,0,1)
                });
            
            _device.VertexShader.SetConstantBuffer(0, constantBuffer );
Около полу часа пытался понять почему в пиксельном работает, а в вершинном нет, оказалось передавал не туда :D
Помог, нажми на весы
html, js, php, С++, С#, OpenGl, DirectX, XNA, HLSL
Inv1s вне форума Ответить с цитированием
Старый 06.08.2013, 11:33   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Потом всё равно придётся обновлять буфер, не будете же создавать каждый раз новый.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Directx Ev1L Visual C++ 6 11.01.2011 13:52
C# + directx dampirik Общие вопросы .NET 2 22.01.2010 10:07
DirectX 9 НЕБО Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 18.01.2010 22:51
directx и C++ dampirik Общие вопросы C/C++ 4 20.11.2009 14:00
С++ и DirectX Элодар Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 22.02.2009 00:23