Шейдеры с нуля

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры с нуля

Сообщение Mikle » 01.10.2014 (Ср) 15:35

PilatP писал(а):по этому я и передавал координаты, а не матрицу. Как по мне удобней просто передавать координаты.

Координаты - это только координаты, а матрица задаёт ЛЮБУЮ трансформацию.
Можно, конечно, передавать координаты, углы по трём осям, масштаб по двум осям, но, во-первых, очень много параметров, во-вторых, в большинстве случаев они не будут использоваться, а вычисления всё равно каждый раз будут выполняться, в-третьих, всё равно скос, к примеру (это когда квадрат становится ромбом), задать не получится.

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Шейдеры с нуля

Сообщение PilatP » 03.10.2014 (Пт) 10:22

Mikle писал(а):По поводу позиций спрайтов на месте 3D объектов. Её лучше всего получать из матрицы WVP данного объекта, эту матрицу мы вычисляем для вертексного шейдера:
Код: Выделить всё
  MatrixMultiply Mtrx, mWorld, mView
  MatrixMultiply Mtrx, Mtrx, mProj

Добавь 4D вектор:
Код: Выделить всё
  Dim vSpr As D3DVECTOR4

И найди его величину, используя эту матрицу:
Код: Выделить всё
  Vec4Transform vSpr, Vec4(0, 0, 0, 1), Mtrx

Это надо делать до транспозиции матрицы.
После этого спрайт рисуется как-то так:
Код: Выделить всё
  If vSpr.w > 0 Then
    SpriteDraw ScrCenterX * (1 + vSpr.x / vSpr.w), ScrCenterY * (1 - vSpr.y / vSpr.w)
  End If

Это без учёта размера спрайта.


Супер работает, и так просто
Код: Выделить всё
  Vec4Transform vSpr, Vec4(0, 0, 0, 1), Mtrx
я так понимаю, что с помощью этой функции мы и получаем координаты экрана, правда я не доконца понял эту конструкцию ScrCenterX * (1 + vSpr.x / vSpr.w) для чего она?
vSpr.x на сколько я понял это и есть координата по Х, правда она интересные значения показывает, как когда мы ищем положение курсора на ланде

и еще вопрос как добавлять смещение спрайта,
Код: Выделить всё
(ScrCenterX * (1 + vSpr.x / vSpr.w))-30
так попробовал, убегает надпись если далеко до обьекта
Я не волшебник, я только учусь)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры с нуля

Сообщение Mikle » 03.10.2014 (Пт) 10:58

PilatP писал(а):попробовал, убегает надпись если далеко до обьекта

Я так понял, 30 - это половина размера спрайта? У меня ничего никуда не убегает, для проверки я прямо в класс cMesh вставил такой код:
Код: Выделить всё
  Vec4Transform v4, Vec4(0, 0, 0, 1), Mtrx
  If v4.w > 0 Then
    SpriteDraw Tex0, (ScrCenterX * (1 + v4.x / v4.w)) - 30, (ScrCenterY * (1 - v4.y / v4.w)) - 30, 60, 60
  End If

Это после строк:
Код: Выделить всё
  MatrixMultiply Mtrx, mWorld, mView
  MatrixMultiply Mtrx, Mtrx, mProj

Перед этим:
Код: Выделить всё
  MatrixTranspose Mtrx, Mtrx

PilatP писал(а):я так понимаю, что с помощью этой функции мы и получаем координаты экрана

Нет, это "приведённые" координаты, если бы это были координаты экрана - это был бы 2D, а не 4D вектор.

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Шейдеры с нуля

Сообщение PilatP » 03.10.2014 (Пт) 11:22

По поводу рисования в текстуру маски - в комплекте к dx_vb есть несколько примеров, в том числе "test", там загружается текстура, копируются данные в массив с помощью GetData и выводятся на форму с помощью PSet.

к сожалению у меня нет этого примера, можеш скинуть

вот код, я так и сделал как ты писал
Код: Выделить всё
  MatrixTranslation Mt1, mXx, mYy, mZz
  MatrixRotationYawPitchRoll Mt2, Ay, Ax, aZ
  MatrixMultiply Mt1, Mt2, Mt1

  MatrixScaling Mt2, ScalX, ScalY, ScalZ
  MatrixMultiply Mtrx, Mt2, Mt1

  MatrixMultiply Mtrx, Mtrx, mView
  MatrixMultiply Mtrx, Mtrx, mProj
 
  Vec4Transform vSpr, Vec4(0, 0, 0, 1), Mtrx
 
  MatrixTranspose Mtrx, Mtrx
  Dev.SetVertexShaderConstantF 0, VarPtr(Mtrx), 4

  MatrixInverse Mtrx, 0, Mtrx
  Vec3TransformNormal v3, DirToLight, Mtrx
  v4 = Vec4(v3.x, v3.y, v3.z, 0)
  Dev.SetVertexShaderConstantF 4, VarPtr(v4), 1
  Dev.SetVertexShaderConstantF 5, VarPtr(Diffuse), 1
  Dev.SetVertexShaderConstantF 6, VarPtr(Ambient), 1
  Dev.SetVertexShaderConstantF 7, VarPtr(Specular), 1
  Vec3TransformCoord v3, CamPos, Mtrx
  Dev.SetVertexShaderConstantF 8, VarPtr(v3), 1

  Dev.SetVertexDeclaration vDecl
  Dev.SetVertexShader Shader(VS).VS
  Dev.SetPixelShader Shader(PS).PS

  Dev.SetStreamSource 0, vBuf, 0, vSize
  Dev.SetIndices iBuf
 
        For i = 0 To SSCnt - 1
                Dev.SetTexture 0, Tekstura(Tex(i, 0)).Textures
                Dev.SetTexture 1, Tekstura(Tex(i, 1)).Textures
                Dev.SetTexture 2, Tekstura(Tex(i, 2)).Textures
                Dev.SetTexture 3, Tekstura(Tex(i, 3)).Textures
            Dev.DrawIndexedPrimitive D3DPT_TRIANGLELIST, 0, 0, AT(i).FaceStart * 3, 0, AT(i).FaceCount
        Next i
   
    If vSpr.w > 0 Then
        Sprites.SpriteDraw Mouse.ic_instr(Mouse.Instrument, 0), (ScrCenterX * (1 + vSpr.x / vSpr.w)), (ScrCenterY * (1 - vSpr.y / vSpr.w)), 30, 30
    End If

все работает четко


2014-10-03 11-04-51 Рабочий стол.png

но спрайт под обьектом, это видно на скрине, по этому и отнимал 210 что бы приподнять спрайт над обьектом


2014-10-03 11-14-08 Рабочий стол.png

я имел в виду если (ScrCenterX * (1 + vSpr.x / vSpr.w)) - 15, (ScrCenterY * (1 - vSpr.y / vSpr.w)) - 210
-15 это половина спрайта,
-210 это поднять над мешом

2014-10-03 11-16-41.png

и если отодвинуть меш то сьежает, спрайт, сама функция получения координат, работает четко, я о том как сделать чтобы спрайт можно было выводить над обьектом, мое предположение, это нужно делать до получения координат. где то здесь
Код: Выделить всё
Vec4Transform vSpr, Vec4(0, 0, 0, 1), Mtrx
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры с нуля

Сообщение Mikle » 03.10.2014 (Пт) 12:43

PilatP писал(а):к сожалению у меня нет этого примера, можеш скинуть

Вот же dx_vb плюс несколько демок:
http://mikle.ucoz.com/load/0-0-0-7-20
Вроде я давал уже.
PilatP писал(а):если отодвинуть меш то сьежает

Видимо сам меш не отцентрован относительно начала координат, тогда ты прав, сюда:
Код: Выделить всё
Vec4Transform vSpr, Vec4(0, 0, 0, 1), Mtrx

вместо трёх нулей подставь координаты центра меша (найди xMin, xMax, yMin... и т. д. и усредни их), можно не обязательно брать центр, а вообще любую точку в пространстве меша, к которой хочешь привязать спрайт.

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Шейдеры с нуля

Сообщение PilatP » 03.10.2014 (Пт) 13:24

Mikle а как рисовать, я так понял RGB на Picturebox, а как быть тогда с Alfa?
Я не волшебник, я только учусь)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры с нуля

Сообщение Mikle » 03.10.2014 (Пт) 13:55

Прямо в массив вноси данные, тебе же попиксельно нужно рисовать.

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Шейдеры с нуля

Сообщение PilatP » 03.10.2014 (Пт) 17:36

гляну, будут вопрсы, напишу
Я не волшебник, я только учусь)

Пред.

Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList