Конференция "Игры" » Вершинный шейдер [Delphi, Windows]
 
  • 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 сунуть лицензия не позвеоляет...
 
Конференция "Игры" » Вершинный шейдер [Delphi, Windows]
Есть новые Нет новых   [134430   +3][b:0][p:0.002]