-
Taur (03.05.09 15:46) [0]Добрый день,
Никак не могу разобраться с вершинным шейдером. Вообщем заача проста, есть прямоугольник, на который натянута текстура, необходимо менять координаты вершин.
Создание шейдера:D3DXCreateEffectFromFile(pD3DDevice,'simple.vsh', nil, nil, 0, nil,
pEffect, nil);
pEffect.SetTechnique('Transform');
// Структура объявления вершин
decl[0].Stream:=0;
decl[0].Offset:=0;
decl[0]._Type:=D3DDECLTYPE_FLOAT3;
decl[0].Method:=D3DDECLMETHOD_DEFAULT;
decl[0].Usage:=D3DDECLUSAGE_POSITION;
decl[0].UsageIndex:=0;
decl[1]:=D3DDECL_END;
// Создаем объявление вершин
pD3DDevice.CreateVertexDeclaration(@decl, VertDecl);
// Создаем переменную матрицы проекции
Aspect := 800 / 600;
D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0,
Aspect, 0.1, 1000.0);
Отображение:D3DXMatrixMultiply(Full, World, View);
D3DXMatrixMultiply(Full, Full, matProjection);
// Устанавливаем переменные шейдера
pEffect.SetValue('TimeFactor', @ViewAngle, D3DX_DEFAULT);
pEffect.SetValue('mat', @Full, D3DX_DEFAULT);
// Указываем шейдеру формат вершин
pD3DDevice.SetVertexDeclaration(VertDecl);
// Отображаем объект с использованием шейдера
pEffect._Begin(@uPass, 0);
for i:=0 to uPass-1 do
begin
pEffect.BeginPass(i);
for iGrassNum:=0 to NUM_GRASS-1 do
begin
pD3DDevice.SetTexture( 0, GrassTextures[m_Grass[iGrassNum].dwGrassTexture] );
pD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, m_Grass[iGrassNum].dwOffset, 2);
end;
pEffect.EndPass;
end;
pEffect._End();
Сам шейдер:struct VS_OUTPUT
{
float4 pos : POSITION;
};
float4x4 mat : WORLDVIEWPROJECTION;
float TimeFactor = 1.0f;
VS_OUTPUT ShaderFunc(float4 Pos : POSITION)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
Pos.y += sin(Pos+TimeFactor);
Out.pos = mul(Pos, mat);
return Out;
}
technique Transform
{
pass P0
{
VertexShader = compile vs_1_1 ShaderFunc();
}
}
Первый вопрос, можно ли так строить треугольники? Дело в том, что в книге, по которой изучаю (М.Фленов Delphi и DirectX искусство программирования) построение примитивов всегда осуществляется с помощью DrawIndexedPrimitive (с заданием буферов индексов и вершин).
И второй вопрос, правильно ли написан сам шейдер?
Заранее благодарен. -
@!!ex © (03.05.09 18:55) [1]> Первый вопрос, можно ли так строить треугольники?
Как так? В коде треугольников не строится.
> М.Фленов
Брось каку.
> И второй вопрос, правильно ли написан сам шейдер?
Возьми любой редактор и там проверь. Чисто внешне - вроде норм. -
Taur (03.05.09 22:07) [2]
> Как так? В коде треугольников не строится.
Извиняюсь за неточную формулировку, я имел ввиду отображение треугольников с помощью:pD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, m_Grass[iGrassNum].dwOffset, 2);
Насчет самого создания, там все правильно, т.к. без использывания шейдеров выводил. -
@!!ex © (03.05.09 22:52) [3]> Насчет самого создания, там все правильно, т.к. без использывания
> шейдеров выводил.
Ну а что изменило использование шейдеров? :)
Правильно вроде.
Проблема то в чем? Не работает? -
Taur (06.05.09 23:24) [4]Да, не работает, точнее не выводит ничего. Наверно тогда проблемма в шейдере, сейчас скачал программу RenderMonke, как разберучь в ней, буду искать, что сделал в шейдере не так... )
-
@!!ex © (06.05.09 23:31) [5]> [4] Taur (06.05.09 23:24)
http://pda.delphimaster.net/?id=1186325580&n=9
169 пост.
Render Monkey не подходит для нормальной разработки шейдеров. -
Taur (06.05.09 23:43) [6]
> http://pda.delphimaster.net/?id=1186325580&n=9169
> пост.Render Monkey не подходит для нормальной разработки
> шейдеров.
Благодарю. -
@!!ex © (06.05.09 23:48) [7]> [5] @!!ex © (06.05.09 23:31)
> Render Monkey не подходит для нормальной разработки шейдеров.
Кстати, именно это и стало причиной разработки Shader Config'a
> [6] Taur (06.05.09 23:43)
Кстати, мы толком не тестировали поддержку Direct3D. Так что за помощь и фидбэк буду очень благодарен. -
Sapersky (08.05.09 16:59) [8]Фидбэк с "любимой" Intel:
No Direct3D9 device (ну и No VBO, но это понятно).
В CreateDevice жёстко забито D3DCREATE_HARDWARE_VERTEXPROCESSING?
Несложно ведь проверить: IDirect3D.GetDeviceCaps, смотрим TD3DCaps.DevCaps, если там нет D3DDEVCAPS_HWTRANSFORMANDLIGHT, устанавливаем D3DCREATE_SOFTWARE_VERTEXPROCESSING. -
@!!ex © (08.05.09 19:01) [9]> [8] Sapersky (08.05.09 16:59)
В принципе можно. Наверно так и сделаю.
Две ИМХИ:
1) Писать шейдеры на компе фактически без поддержки шейдеров - это верх мазохизма. :)
2) Имеет смысл использовать Всевозможные Swift Shader'ы. Для OpenGL я сунул в дистрибутив Mesa Driver, а вот Swift сунуть лицензия не позвеоляет...