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

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

Модератор: Mikle

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

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

Сообщение PilatP » 17.09.2014 (Ср) 18:33

Да спрайт отобразился, хотя только тогда, когда рендерится какая нибудь модель :roll: , и поведение типа, вертится как модель.
Захват-2.jpg
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 18.09.2014 (Чт) 9:51

Нашол модель в инете, конвертировал в .X, загружаю в конвертер и шок, как такое может быть
Захват-3.png

Инндексы, встречаются отрицательные, и встречаются превосходящие количество :shock:
Это глюк Панды, или модель, и как можно исправить?
вот модель https://yadi.sk/d/vCJdRjfWbXjcn
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 18.09.2014 (Чт) 11:07

Просто нужно делать индексный буфер в формате D3DFMT_INDEX32.

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

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

Сообщение PilatP » 18.09.2014 (Чт) 18:01

Mikle, мне интересно почему, такое возможно. Ведь в индексном буфере ссылка, на не существующий вертекс, или я что то не до понял, и как может быть отрицательный номер вертекса, разве нумерация вертексов не с 0.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 18.09.2014 (Чт) 18:44

Тип Integer может содержать число от -32768 до 32767, а в индексах типа D3DFMT_INDEX16 используется беззнаковый uint16. Индекс с номером 32767 с этим номером и останется, №32768 станет в бейсике -32768, №32769 станет -32767 и т. д. №65535 станет -1. Если номеров больше, чем 65536 - нужно использовать D3DFMT_INDEX32.

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

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

Сообщение PilatP » 18.09.2014 (Чт) 19:34

:shock: Круто я не знал этого.
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 18.09.2014 (Чт) 19:39

Mikle писал(а):Просто нужно делать индексный буфер в формате D3DFMT_INDEX32.

И как это сделать?
если
Код: Выделить всё
d3dpp.AutoDepthStencilFormat = D3DFMT_INDEX32
то у меня выбивает ошибку на инициализации DX8
Я не волшебник, я только учусь)

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

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

Сообщение The trick » 18.09.2014 (Чт) 20:53

PilatP писал(а):И как это сделать?
если
Код: Выделить всё
d3dpp.AutoDepthStencilFormat = D3DFMT_INDEX32
то у меня выбивает ошибку на инициализации DX8

При чем тут формат буфера глубины?
Тебе нужен формат индексного буфера (3-й параметр CreateIndexBuffer)
UA6527P

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

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

Сообщение Mikle » 18.09.2014 (Чт) 21:28

PilatP писал(а):d3dpp.AutoDepthStencilFormat = D3DFMT_INDEX32

Дожили :(
Кривоус Анатолий писал(а):Тебе нужен формат индексного буфера (3-й параметр CreateIndexBuffer)

И плюс к этому замена типа Integer на Long в массиве для индексов. Всё это и в DX8 конверторе, и в DX9 просмотрщике.

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

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

Сообщение PilatP » 19.09.2014 (Пт) 11:45

Кривоус Анатолий писал(а):Кривоус Анатолий писал(а):
Тебе нужен формат индексного буфера (3-й параметр CreateIndexBuffer)

В том то и дело, что в коде нет
Код: Выделить всё
CreateIndexBuffer


Код: Выделить всё
Public Sub LoadMesh(Mesh_path As String, Mesh_name As String)
  Dim mBuffer As D3DXBuffer
  Dim n As Long
  Dim k As Single, strTexName As String
  Dim MinX As Single, MaxX As Single
  Dim MinY As Single, MaxY As Single
  Dim MinZ As Single, MaxZ As Single
  Dim Mtrx As D3DMATRIX

  Set Mesh.Model = d3dx.LoadMeshFromX(Mesh_path & Mesh_name, D3DXMESH_MANAGED, d3dDevice, Nothing, mBuffer, SSCnt)
  Set Mesh.Model = Mesh.Model.CloneMeshFVF(D3DXMESH_MANAGED, vFlag, d3dDevice)
    Vert_Kol = Mesh.Model.GetNumVertices - 1&
    Polig_Kol = Mesh.Model.GetNumFaces * 3&

  MeshVertCount = Mesh.Model.GetNumVertices
  ReDim Vert(MeshVertCount - 1)
  MeshIndCount = Mesh.Model.GetNumFaces * 3
  ReDim Ind(MeshIndCount - 1)
  Set vBuf = Mesh.Model.GetVertexBuffer
  Set iBuf = Mesh.Model.GetIndexBuffer
  SizeOfVertex = Len(Vert(0))
  D3DVertexBuffer8GetData vBuf, 0, MeshVertCount * SizeOfVertex, D3DLOCK_DISCARD, Vert(0)
  D3DIndexBuffer8GetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DLOCK_DISCARD, Ind(0)

  Set Mesh.Model = Mesh.Model.Optimize(D3DXMESHOPT_ATTRSORT, ByVal 0, ByVal 0, ByVal 0, Nothing)
  ReDim AT(SSCnt - 1)
  ReDim MM(SSCnt - 1)
 
    ReDim Mesh.MeshMaterials(SSCnt)
    ReDim Mesh.Tekstyr(SSCnt)
    ReDim Mesh.nameTekstyr(SSCnt)

  For n = 0 To SSCnt - 1
    frmMesh.LstSS.AddItem Str$(n)
    d3dx.BufferGetMaterial mBuffer, n, MM(n).MatD3D
    MM(n).TextureFilename = d3dx.BufferGetTextureName(mBuffer, n)
       strTexName = MM(n).TextureFilename
       Mesh.nameTekstyr(n) = strTexName
   If strTexName <> "" Then
   
        Set Mesh.Tekstyr(n) = d3dx.CreateTextureFromFile(d3dDevice, Mesh_path & strTexName)
   End If

  Next n
  Mesh.Model.GetAttributeTable AT(0), SSCnt

  MinX = 1000000: MaxX = -1000000
  MinY = 1000000: MaxY = -1000000
  MinZ = 1000000: MaxZ = -1000000
  For n = 0 To MeshVertCount - 1
    If MinX > Vert(n).Pos.X Then MinX = Vert(n).Pos.X
    If MaxX < Vert(n).Pos.X Then MaxX = Vert(n).Pos.X
    If MinY > Vert(n).Pos.Y Then MinY = Vert(n).Pos.Y
    If MaxY < Vert(n).Pos.Y Then MaxY = Vert(n).Pos.Y
    If MinZ > Vert(n).Pos.Z Then MinZ = Vert(n).Pos.Z
    If MaxZ < Vert(n).Pos.Z Then MaxZ = Vert(n).Pos.Z
  Next n

  k = MaxX - MinX
  If k < MaxY - MinY Then k = MaxY - MinY
  If k < MaxZ - MinZ Then k = MaxZ - MinZ
  k = 1 / k
  D3DXMatrixScaling Mtrx, k, k, k
  d3dDevice.SetTransform D3DTS_WORLD, Mtrx
  D3DXMatrixTranslation Mtrx, -0.5 * (MaxX + MinX), -0.5 * (MaxY + MinY), -0.5 * (MaxZ + MinZ)
  d3dDevice.MultiplyTransform D3DTS_WORLD, Mtrx

  D3DVertexBuffer8SetData vBuf, 0, MeshVertCount * SizeOfVertex, D3DLOCK_DISCARD, Vert(0)
  D3DIndexBuffer8SetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DLOCK_DISCARD, Ind(0)
  load_mesh = True
End Sub



Mikle писал(а):И плюс к этому замена типа Integer на Long в массиве для индексов. Всё это и в DX8 конверторе, и в DX9 просмотрщике.

Их я уже заменил.

Код: Выделить всё
D3DIndexBuffer8SetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DFMT_INDEX32, Ind(0)

подставил сюда, ошибку уже не выбивает.
Последний раз редактировалось PilatP 19.09.2014 (Пт) 11:54, всего редактировалось 1 раз.
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 19.09.2014 (Пт) 11:53

но изначальная проблема осталась
тут в любом случае выбивает ошибку
Код: Выделить всё
Subscript out of range
в этом месте
Код: Выделить всё
For n = 0 To SSCnt - 1
      For i = 0 To AT(n).FaceCount * 3 - 1
        cI = Ind(AT(n).FaceStart * 3 + i)
        [b]If Used(cI) < 0 Then[/b]

cI=68157741, а это больше чем есть вертексов 57824

вот код сохранения

Код: Выделить всё
Public Sub Save_Mesh()
  Dim II() As Long, VV() As vvFormat, Used() As Long
  Dim cV As Long, cI As Long, cInd As Long
  Dim i As Long, nf As Long, n As Long, IndCnt As Long

  IndCnt = 0
  For n = 0 To SSCnt - 1
      IndCnt = IndCnt + AT(n).FaceCount * 3
  Next n
  ReDim II(IndCnt - 1)
  ReDim VV(MeshVertCount - 1)
  ReDim Used(MeshVertCount - 1)
  For i = 0 To MeshVertCount - 1
    Used(i) = -1
  Next i
  cV = 0
  cInd = 0
  For n = 0 To SSCnt - 1
      For i = 0 To AT(n).FaceCount * 3 - 1
        cI = Ind(AT(n).FaceStart * 3 + i)
        If Used(cI) < 0 Then
          VV(cV).Pos = Vert(cI).Pos
          VV(cV).Norm = Vert(cI).Norm
          VV(cV).tu = Vert(cI).tu
          VV(cV).tv = Vert(cI).tv
           Used(cI) = cV
          II(cInd) = cV
          cV = cV + 1
        Else
          II(cInd) = Used(cI)
        End If
        cInd = cInd + 1
      Next i
  Next n
  ReDim Preserve VV(cV - 1)
  nf = FreeFile
  Open App.Path & "\Mesh\Out\" & Name_mesh & ".mesh" For Binary As #nf
 
    Put #nf, , cV
    Put #nf, , IndCnt
    Put #nf, , VV()
    Put #nf, , II()
    Close #nf
   Dim ts
   Dim a

   If fso.FileExists(App.Path & "\Mesh\Out\" & Name_mesh & ".imesh") Then
        'Set a = fso.CreateTextFile(App.Path & "\Mesh\Out\" & Name_mesh & ".imesh", True)
        Set ts = fso.OpenTextFile(App.Path & "\Mesh\Out\" & Name_mesh & ".imesh", ForWriting, True)
        ts.WriteLine MeshVertCount & "\/"
        ts.WriteLine MeshIndCount & "\/"
        ts.WriteLine SSCnt & "\/"
       For n = 0 To SSCnt - 1
            ts.WriteLine Mesh.nameTekstyr(n) & "\/"
            ts.WriteLine AT(n).FaceStart & "\/"
            ts.WriteLine AT(n).FaceCount & "\/"
            ts.WriteLine AT(n).VertexStart & "\/"
            ts.WriteLine AT(n).VertexCount & "\/"
        Next n
        ts.Close
    End If

End Sub
Я не волшебник, я только учусь)

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

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

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

PilatP писал(а):Их я уже заменил.

Код: Выделить всё
D3DIndexBuffer8SetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DFMT_INDEX32, Ind(0)


подставил сюда, ошибку уже не выбивает.

Фантастика... как относится формат индекса к параметрам блокировки массива?
Нужно тут вставлять:
Код: Выделить всё
Set Mesh.Model = Mesh.Model.CloneMeshFVF(D3DXMESH_MANAGED Or D3DXMESH_32BIT, vFlag, d3dDevice)

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

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

Сообщение PilatP » 19.09.2014 (Пт) 13:45

Mikle писал(а):Фантастика... как относится формат индекса к параметрам блокировки массива?

:oops: Mikle, не суди строго. :oops:
Действительно все заработало :D
Mikle, если не отбило желание, может продолжим с ландшафтом :oops:
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 19.09.2014 (Пт) 23:18

PilatP писал(а):может продолжим с ландшафтом

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

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

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

Сообщение PilatP » 20.09.2014 (Сб) 10:38

Mikle писал(а):Тебя устраивает вариант на Volume текстуре со всеми его недостатками?

Mikle а можно ли для промежуточного перехода, выбирать текстуру, для перехода
типа т1 и т8 а промежуточная т4, в другом месте т3-т1 пром т6

И можно ли на Volume текстуре обойтись без промежуточных текстур?
Например, можно попробовать так есть главная текстура т1, а остальные для рисования используют промежуточную именно главную текстуру т1 (т6-т9) а промежуточная т1
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 20.09.2014 (Сб) 14:50

PilatP писал(а):можно ли для промежуточного перехода, выбирать текстуру, для перехода
типа т1 и т8 а промежуточная т4

Нет, между т1 и т8 будет шесть промежуточных текстур т2...т7.
PilatP писал(а):можно ли на Volume текстуре обойтись без промежуточных текстур?

Нет, только если отключить фильтрацию текстуры-маски, но тогда все границы будут клеточками с прямыми углами.
Предлагаю вариант - делать 5 текстур (плюс 5 нормалмапов) и одна ARGB текстура-маска. Спекуляр с ландшафта убрать - его на скринах танчиков не видно, он для материалов ландшафта практически не нужен. Спекуляр бывает заметен на гладком асфальте - вот на дорогу его потом и накладывать.

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

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

Сообщение PilatP » 20.09.2014 (Сб) 15:12

Mikle писал(а):Предлагаю вариант - делать 5 текстур (плюс 5 нормалмапов) и одна ARGB текстура-маска.

5 текстур это надеюсь не придел? Для старта этого достаточно, но вдруг потребуется больше 5 текстур
И можно по подробней об этом варианте.

Mikle писал(а): Спекуляр с ландшафта убрать - его на скринах танчиков не видно, он для материалов ландшафта практически не нужен. Спекуляр бывает заметен на гладком асфальте - вот на дорогу его потом и накладывать.

Согласен, для ланда он не обязателен, а дорога будет отдельно.


И еще как сделать такое
shot_011.png

имеется в виду надписи над обьектами, на сколько я понял они выводятся как спрайты на экране(2D), вопрос как получать эти координаты.(я так понял что это типа того как мы получаем координаты на ланде, только в обратном порядке)
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 20.09.2014 (Сб) 15:38

PilatP писал(а):5 текстур это надеюсь не придел? Для старта этого достаточно, но вдруг потребуется больше 5 текстур
И можно по подробней об этом варианте.

5 - это предел, это что-то типа моего старого варианта на PS_1_4, только с нормалями. Зато можно смешивать текстуры в любом сочетании.
Честно говоря, не понимаю, куда столько текстур на обычный ландшафт. Или у тебя на картах будут ОДНОВРЕМЕННО снег, трава, песок, камень, всего по несколько видов?

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

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

Сообщение PilatP » 20.09.2014 (Сб) 15:41

Типа да, например ландшафт,
гора, т1
возле горы т2
трава т3 (тоже может быть несколько,)
грунт типа поле т4(их может понадобится несколько)
песок, т5
Если это конечно упростит, и ускорит ланд, то можно конечно обойтись и 5, хотя конечно хотелось бы иметь больше текстур в распоряжении
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 21.09.2014 (Вс) 16:41

Вот ландшафт с пятью материалами и туманом:
https://yadi.sk/d/6tyHRHKXbaoA2
Чтобы горы вдали полностью растворялись в тумане, цвет у тумана и неба должен совпадать.

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

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

Сообщение PilatP » 21.09.2014 (Вс) 17:40

Mikle, спасибо, за пример, буду смотреть.
Кстати, можеш помочь с надписями. Я примерно понимаю как но как это сделать, но(код) не знаю.
С моделями почти закончил, осталось только sabset, как закончу, скину проект.
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 21.09.2014 (Вс) 17:57

Mikle, пример мега супер, то что нужно. :D
Единственно, можно ли сделать так же, как в примере Volume текстуре, а именно рисование и приминение текстуры mask во время редактирования ланда.
Типа рисование наглядно, по ланду.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 21.09.2014 (Вс) 21:31

По поводу позиций спрайтов на месте 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

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

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

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

Сообщение PilatP » 22.09.2014 (Пн) 10:39

Этот код относится к 8, или 9.
в 9 на сколько я знаю нет спрайтов
Я не волшебник, я только учусь)

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

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

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

Это относится к DX9, я подставил условный вызов, ты же писал, что у тебя есть своя реализация спрайта. Смысл - показать откуда берутся X и Y.

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

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

Сообщение PilatP » 22.09.2014 (Пн) 11:09

Спасибо, я думал ты о 8.
Да написал класс спрайта, есть даже идея о вращении. Допишу, выложу.
Да очень нужный, код, сегодня постараюсь прикрутить
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 23.09.2014 (Вт) 8:21

По поводу рисования в текстуру маски - в комплекте к dx_vb есть несколько примеров, в том числе "test", там загружается текстура, копируются данные в массив с помощью GetData и выводятся на форму с помощью PSet.
По аналогии с GetData есть SetData, делай массив по размеру текстуры, сам заноси туда нужные данные, после каждого изменения отправляй в текстуру с помощью SetData. ИМХО для данной задачи это подходит больше, чем рендер в текстуру.

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

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

Сообщение PilatP » 24.09.2014 (Ср) 12:45

Mikle, возникла проблема, добавив вывод спрайта 3д, после меша, спрайт вращается и позиция как у меша.

Код: Выделить всё
Friend Sub Draw(mXx As Single, mYy As Single, mZz As Single, Ax!, Ay!, aZ!, Optional ScalX! = 1, Optional ScalY! = 1, Optional ScalZ! = 1)
    Dim matRot As D3DMATRIX
    Dim matScal As D3DMATRIX
    Dim matRotX As D3DMATRIX
    Dim matRotY As D3DMATRIX
    Dim matRotZ As D3DMATRIX

  Dim Mtrx As D3DMATRIX
  Dim v3 As D3DVECTOR
  Dim v4 As D3DVECTOR4
  Dim i As Long

MatrixScaling matScal, ScalX, ScalY, ScalZ
MatrixRotationX matRotX, Ax
MatrixRotationY matRotY, Ay
MatrixRotationZ matRotZ, aZ
MatrixMultiply matRot, matRotX, matRotY
MatrixMultiply matRot, matRot, matRotZ

MatrixMultiply matRot, matScal, matRot

MatrixTranslation mWorld, mXx, mYy, mZz
MatrixMultiply mWorld, matRot, mWorld
Dev.SetTransform D3DTS_WORLD, mWorld



  MatrixMultiply Mtrx, mWorld, mView
  MatrixMultiply Mtrx, Mtrx, mProj
  MatrixTranspose Mtrx, Mtrx
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 24.09.2014 (Ср) 13:07

Если там FFP, то где задание трансформаций проекции и обзора? И зачем это:
Код: Выделить всё
  MatrixMultiply Mtrx, mWorld, mView
  MatrixMultiply Mtrx, Mtrx, mProj
  MatrixTranspose Mtrx, Mtrx

Если шейдер - то зачем это:
Код: Выделить всё
Dev.SetTransform D3DTS_WORLD, mWorld

И ещё, всё это:
Код: Выделить всё
MatrixRotationX matRotX, Ax
MatrixRotationY matRotY, Ay
MatrixRotationZ matRotZ, aZ
MatrixMultiply matRot, matRotX, matRotY
MatrixMultiply matRot, matRot, matRotZ

заменяется одной строкой MatrixRotationYawPitchRoll.

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

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

Сообщение PilatP » 24.09.2014 (Ср) 14:40

этот код я выдрал из старого проекта, он служил для врашения, изменения размера, и позиционирования меша, по заданным параметрам

вот код что получился, это для меша
Код: Выделить всё
Friend Sub Draw(mXx As Single, mYy As Single, mZz As Single, Ax!, Ay!, aZ!, Optional ScalX! = 1, Optional ScalY! = 1, Optional ScalZ! = 1)
    Dim matRot As D3DMATRIX
    Dim matScal As D3DMATRIX
    Dim matRotX As D3DMATRIX
    Dim matRotY As D3DMATRIX
    Dim matRotZ As D3DMATRIX

  Dim Mtrx As D3DMATRIX
  Dim v3 As D3DVECTOR
  Dim v4 As D3DVECTOR4
  Dim i As Long

MatrixScaling matScal, ScalX, ScalY, ScalZ
MatrixRotationX matRotX, Ax
MatrixRotationY matRotY, Ay
MatrixRotationZ matRotZ, aZ
MatrixMultiply matRot, matRotX, matRotY
MatrixMultiply matRot, matRot, matRotZ

MatrixMultiply matRot, matScal, matRot

MatrixTranslation mWorld, mXx, mYy, mZz
MatrixMultiply mWorld, matRot, mWorld
Dev.SetTransform D3DTS_WORLD, mWorld



  MatrixMultiply Mtrx, mWorld, mView
  MatrixMultiply Mtrx, Mtrx, mProj
  MatrixTranspose Mtrx, Mtrx
  Dev.SetVertexShaderConstantF 0, VarPtr(Mtrx), 4

  MatrixInverse Mtrx, 0, mWorld
  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 VS
  Dev.SetPixelShader 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

     'Dev.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW
End Sub


самое интересное работало, но добавив вывод спрайта после меша, все и за крутилось,
вопрос как сделать правильно, чтобы можно было вращать, изменять размер, передавая параметры для меша
Последний раз редактировалось PilatP 24.09.2014 (Ср) 15:17, всего редактировалось 1 раз.
Я не волшебник, я только учусь)

Пред.След.

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

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

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

    TopList  
cron