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

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

Модератор: Mikle

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

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

Сообщение Mikle » 06.09.2014 (Сб) 9:43

PilatP писал(а):честно говоря, я не понял, это что какой то генератор их генерирует (бинормаль и/или тангент)

Их можно сгенерировать в том же 3D Max при создании модели. Были у меня мысли, как сгенерировать самому, в любом случае нужна соответствующая модель с нормалмапой, типа этого браслета.
PilatP писал(а):видно, хорошо что пол шероховат

Такое сделать не сложно, тут вообще спекуляр не заметно, обычный попиксельный диффуз, сделаю.

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

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

Сообщение PilatP » 06.09.2014 (Сб) 15:22

Mikle а подойдет ли для этого текстура Disp? Из тех что я опубликовал можно использовать в примере
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 06.09.2014 (Сб) 21:11

Текстуры с виду хорошие, но с недостатком - у них размер не степень двойки.

Я сделал пример с текстурами, которые ты выложил в начале, кроме OCC (честно говоря, не понял, что это).
Но DISP и SPEC - монохромные, я их запихнул в альфаканалы COLOR и NRM текстур, что и тебе советую делать. Дело в том, что семплирование текстуры (texld) - одна из самых тяжёлых инструкций пиксельного шейдера, чем их меньше - тем лучше. А "тусовать" различные каналы в текстурах очень просто, я для этого использую SR2D, вот программа, которой я из четырёх текстур сделал две, там всё предельно просто и понятно: https://yadi.sk/d/R7i7sbI6b9GEQ

Теперь к самому ландшафту, вот проект: https://yadi.sk/d/Yjtp5amIb9L5o
Из формата вертекса убрана лишняя пара текстурных координат, направление на свет и позицию камеры передаём в вертексный шейдер без предварительной трансформации, так как ландшафт у нас неподвижен. А вот значения Diffuse, Ambient и Specular теперь передаём не в вертексный, а в пиксельный шейдер, коли уж мы делаем попиксельное освещение.
В VB6 коде больше ничего не поменялось (в классе LandScape добавил генерацию TBN, но это к теме не относится), главное - в шейдерах.

Вертексный шейдер:
Код: Выделить всё
dp3 oT1.x, v1, c4
dp3 oT1.y, v2, c4
dp3 oT1.z, v3, c4

Эти три инструкции dp3 - это то же самое, что макрос m3x3, но макрос может работать только с последовательностью констант в качестве матрицы, а нам нужна последовательность полей в вертексе v1..v3.
Три вектора, Tangent Binormal и Normal составляют базис, то есть вместе как раз составляют матрицу 3*3, необходимую для поворота вектора в локальную систему координат объекта. Ведь, раз мы используем Normal Map, мы нормали берём из текстуры, их ещё нужно "доворачивать" в зависимости от того, как ориентирована текстурируемая точка на модели. Но мы, как и в прошлом примере, поворачиваем не нормаль, а направление на источник света.
sub r0, c5, v0 - вычислили направление на камеру.
И тоже повернули:
Код: Выделить всё
dp3 oT2.x, v1, r0
dp3 oT2.y, v2, r0
dp3 oT2.z, v3, r0

Заметь, для передачи векторов из вертексного шейдера в пиксельный мы используем oT1 и oT2, регистры, предназначенные для текстурных координат. Просто кроме них есть только oD0 и oD1, предназначенные для цветовых значений, других каналов для связи вертексного шейдера с пиксельным нет.

Пиксельный шейдер:
texld r0, t0, s0 - семплируем Color текстуру.
texld r1, t0, s1 - семплируем Normal текстуру. Но диапазон возможных значений цвета 0..1, а нам нужно -1..1, ведь это не цвет, а вектор, поэтому приводим диапазон:
mad r1.rgb, r1, c3.x, c3.y - у первого аргумента, приёмника, стоит маска .rgb. Это потому, что в альфаканале лежит Specular Map, его диапазон приводить не нужно.
Далее нормализуем направления:
Код: Выделить всё
nrm r2, t1
nrm r3, t2

Направление на источник света у нас было изначально нормализовано, но при интерполяции между вертексами при растеризации длина вектора может несколько измениться (пояснять не нужно?), а направление на камеру у нас вообще не было нормализовано.
На данный момент что имеем в регистрах:
Код: Выделить всё
// r0 - col + disp map
// r1 - norm + spec map
// r2 - dir to light norm
// r3 - dir to camera norm

Далее:
dp3 r4, r1, r2 - "сравнили" нормаль с направлением на свет.
max r4, r4, c4.x - отсекли значения <0. Теперь в r4 у нас освещённость данной точки (ещё не совсем Diffuse).
Так же, как мы вычисляли спекуляр для модели в прошлом примере, вычисляем и тут:
Код: Выделить всё
add r6, r2, r3
nrm r5, r6
dp3 r5, r1, r5
mad r5, r5, c3.z, c3.w
max r5, r5, c4.x
mul r5, r5, c2
mul r5, r5, r4

В последней строке значение Specular домножается на величину освещенности, чтобы убрать блики в тех местах, куда не попадает свет.
mul r4, r4, c0 - получили цвет Diffuse.
mad r4, c1, r0.a, r4 - добавили Ambient с учётом карты DISP
mul r4, r4, r0 - домножили на цвет из текстуры.
mad r0, r5, r1.a, r4 - сложили полученный цвет со Specular, умноженным на выборку из Specular Map.
mov oC0, r0 - в бэкбуфер.

Вроде, всё. Попробуй в коде перед рисованием ландшафта обнулять цвета Diffuse, Ambient и Specular, оставляя только один, чтобы увидеть действие этих величин по отдельности.

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

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

Сообщение PilatP » 07.09.2014 (Вс) 11:03

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

Захват-2.jpg


еще вопрос, как к этой красоте на ландшафте, добавить несколько доп текстур, сделать как в твоем примере с шедерами где ты рисовал по карте используя 8 текстур.

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

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

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

Сообщение PilatP » 07.09.2014 (Вс) 14:47

Попробовал доработать программу для текстур, но что то выбивает ошибку,
Код: Выделить всё
"File not found: SR2D"
, можеш глянуть.
Я так понимаю что не может найти SR2D.dll, хотя твой пример работает, без проблем.
Textur Edit.zip

текстуры удалил, большой архив получается, но текстуры те же что в ланде, да и еще можно ли сохранять в формате .dds? если можно, добавь пожалуста, я стараюсь пользоваться ими
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 07.09.2014 (Вс) 16:33

Очень странно, похоже, что чудит этот контрол, диалог.
Добавляю такой код:
Код: Выделить всё
Private Sub Form_Load()
  Spr1.LoadFromFile "E:\Temp\TexturEdit\Textur Edit\Textur\In\land0_COLOR_1.png"
End Sub

На нём вылетает.
Весь остальной код формы прячу под ремарку - вылетает.
Сохраняю в таком виде и снова загружаю - уже не вылетает.
Снимаю ремарку с кода - первый раз срабатывает, потом вылет.
Попробуй, что ли, обычным Common Dialog обойтись, хотя разобраться, конечно, интересно.

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

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

Сообщение PilatP » 07.09.2014 (Вс) 17:31

Странно конечно, я давно им пользуюсь и не было нареканий, конечно обойдусь пока.

еще вот пытался прикрутить скриншот
Код: Выделить всё
Public Sub MakeScreenShot()
    Dim fb As Direct3DSurface9
    Set fb = Dev.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
   
    Folder_Sys App.Path & "\screenshot\"
    Dim rc As RECT, SD As D3DSURFACE_DESC, pal As PALETTEENTRY
    fb.GetDesc SD
   
    rc.Bottom = SD.Height
    rc.Right = SD.Width
    Dim i As Long
    Do
        If Dir(App.Path & "\screenshot\" & "\" & Êàðòà.Name & Format(i, "0000") & ".png") <> vbNullString Then
            i = i + 1
        Else
            Exit Do
        End If
    Loop
    d3dx.SaveSurfaceToFile App.Path & "\screenshot\" & "\" & Êàðòà.Name & Format(i, "0000") & ".png", D3DXIFF_BMP, fb, pal, rc
    Set fb = Nothing
End Sub

и уперся в то что
Код: Выделить всё
GetBackBuffer
отсутствует :shock: , а как без него можно?
на сколько я понял можно наверно сделать через
Код: Выделить всё
Dev.SetRenderTarget
, но честно говоря, не знаю как.
Mikle: можеш код скриншота под твой врапер написать :oops: , очень нужно.

И еще как можно отслеживать скролинг мышкой, в DX8 я его получал через
Код: Выделить всё
   Mouse.GetDeviceStateMouse MState
   MState.lZ
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 08.09.2014 (Пн) 9:26

PilatP писал(а): можеш код скриншота под твой врапер написать, очень нужно.

Могу. Я, вообще-то, уже написал GetFrontBufferData, но это почему-то не заработало, и я забросил, не было необходимости.
А это, судя по SDK, единственный способ получить изображение с АА (я думаю, рендер в текстуру не учли).
Если тебе нужно для себя, не очень "элегантно" - можно просто жать PrintScreen (+Alt для оконных), а потом, например, Enter, а на нажатие Enter повесить что-то типа:
Код: Выделить всё
Private Sub SaveClipBoardPicture()
  Dim IP As IPicture

  Set IP = Clipboard.GetData
  SavePicture IP, "test.bmp"
End Sub

Конечно, лучше с проверкой на валидность данных. Жаль, что нажатие PrintScreen не ловится через Form_KeyDown, можно было бы прямо на это нажатие повесить сохранение.
Можно ещё попробовать на нажатие того же Enter сначала слать окну сообщение Alt+PrintScreen, а потом сохранять.
PilatP писал(а):как можно отслеживать скролинг мышкой

Где-то здесь на форуме я находил пример опроса MouseWheel через API, дома пример сохранён, если до вечера не найдёшь - пришлю.
PilatP писал(а):как к этой красоте на ландшафте, добавить несколько доп текстур, сделать как в твоем примере с шедерами где ты рисовал по карте используя 8 текстур.

Там, вообще-то, было 5 текстур плюс шестая в качестве маски. Если делать это всё с эффектами, как в последнем примере, то получится 11 текстур. PS_2_0, конечно, гарантированно держит от 12 текстур, но такой подход всё равно не оптимален. Точнее он будет оптимален, только если на большей части ландшафта мы должны видеть смесь этих материалов. Но в реальности, как правило, мы видим один материал, и только на его границе - смесь двух материалов. Кроме того, на ландшафте, как правило, нужны резкие границы между материалами, для таких границ нам не хватит никакого размера текстуры-маски.
Короче, подходов, как всегда, много, решение нужно выбирать исходя из задачи, то есть её нужно описать по подробнее.
PilatP писал(а):ты смотрел исходник, что я скинул чуть ранее по поводу тени, я так и не понял как там сделали тень, и можно ли для этого использовать шейдеры, если да то как

Ещё не смотрел.

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

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

Сообщение PilatP » 08.09.2014 (Пн) 10:51

Mikle писал(а):просто жать PrintScreen
конечно вариант, на покамест.
Но я думаю, попробую по поже реализовать через
Код: Выделить всё
Dev.SetRenderTarget


Mikle писал(а):MouseWheel через API
у меня он тоже есть, но виснет VB при выходе, и не получает ничего, на сколько я помню есть более простой способ, просто не могу вспомнить где искать, исходников вагон. Вот и спросил. Скинь конечно, у меня пример из книги, может что не так с примером.
Mikle писал(а):Короче, подходов, как всегда, много, решение нужно выбирать исходя из задачи, то есть её нужно описать по подробнее.

задача такая, есть ландшафт, на нем нужно будет добавлять дороги, например поля, разные др. типа бетон площадка, асфальт,грунт дорога, и пр.
Можно конечно сделать дополнительными вертексами, но оптимально рисовать.

Вообще у меня есть и на 16 текстур
Ls_vs_ps_16tex.rar
из твоих, я думал с шейдерами 2, эту часть можно реализовать и за один проход?
И конечно же все участвующие текстуры, должны рендерится по тому же принципу это на сколько я понял допустим 15*2+1=31 текстура.
Это вообще реализуемо?
по поводу границ, желалательно, но не критично, но не должно быть посторонних текстур в смешивании.
У вас нет доступа для просмотра вложений в этом сообщении.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 08.09.2014 (Пн) 11:05

Тут не 16, а одна Volume текстура. Так сделать не сложно, но есть тоже свои недостатки - при плавном переходе текстуры 1 в 3 обязательно на границе проявится текстура 2.
Впрочем, тут есть, над чем подумать.

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

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

Сообщение Mikle » 08.09.2014 (Пн) 12:11

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

Значит это другой пример. Вот я нашёл свой и для пробы соединил с DX9, всё работает.
У вас нет доступа для просмотра вложений в этом сообщении.

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

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

Сообщение PilatP » 08.09.2014 (Пн) 13:46

Mikle, пример супер, действительно другой, а тут все просто. :D :D :D Мега СПАСИБО
вставил код, все работает, правда я поставил сразу после DoEvents, то срабатывало очень редко, поставил, до DoEvents, и срабатывает без проблем :D
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 08.09.2014 (Пн) 14:42

Mikle, добавил в твой пример
Код: Выделить всё
Private Sub PicView_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim v As D3DVECTOR
    Mouse.MouseX = x
    Mouse.MouseY = y
     Dim xx As Single, YY As Single
      Dim k As Single
        'GetCursorPos MousePos
        k = Tan(fovy / 2)
        YY = (-(y / 15) / (ScrY / 2)) * k + k
        k = k / Aspect
        xx = ((x / 15) / (ScrX / 2)) * k - k
       

     If Mouse.Selected = False Then
       
        vDir = Vec3(Sin(CamAngle) * Cos(CamDiff), Sin(CamDiff), Cos(CamAngle) * Cos(CamDiff))
        MatrixRotationX mDir, CamDiff
        MatrixRotationY mView, CamAngle
        MatrixMultiply mDir, mView, mDir
        MatrixTranspose mDir, mDir
        v = Vec3(xx, YY, 0)
        Vec3TransformCoord v, v, mDir
        Vec3Add vDir, vDir, v
      Else
        vDir = Vec3(Sin(CamAngle) * Cos(CamDiff), Sin(CamDiff), Cos(CamAngle) * Cos(CamDiff))
      End If
End Sub

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

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

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

Сообщение Mikle » 08.09.2014 (Пн) 15:14

Ну так MouseMove генерируется только тогда, когда курсор над окном. Посмотри везде, где я управляю мышью, я возвращаю курсор в центр окна.
поставил сразу после DoEvents, то срабатывало очень редко, поставил, до DoEvents, и срабатывает без проблем

Потому, что DoEvents() содержит внутри DispatchMessage. В идеале нужно вставлять ВНУТРЬ DoEvents(), для этого перестать им пользоваться, а пользоваться заменой:
Код: Выделить всё
Public Sub MyDoEvents()
  Dim MSG As MSG

  Do While PeekMessage(MSG, 0, 0, 0, PM_REMOVE)
    TranslateMessage MSG
    DispatchMessage MSG
  Loop
End Sub

В эту замену добавить опрос MouseWheel.

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

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

Сообщение PilatP » 08.09.2014 (Пн) 15:27

да, но я через Mouse.Selected = False отключаю, возврат курсора в центр, что самое интересное, я из рабочего проекта на 8, где код этот работал, его сюда перенес и подправил, в соответствии 9, фишка в том что курсор по экрану то перемещается, а объект нет, и в код он заходит, но не меняется позиция, что странно. Когда Mouse.Selected = True, курсор в центре и вращается камера, то и объект за курсором перемещается.
я думаю что тут где то ошибка
Код: Выделить всё
MatrixRotationX mDir, CamDiff
        MatrixRotationY mView, CamAngle
        MatrixMultiply mDir, mView, mDir
        MatrixTranspose mDir, mDir
        v = Vec3(xx, YY, 0)
        Vec3TransformCoord v, v, mDir
        Vec3Add vDir, vDir, v 


Рендер у меня идет в PicView
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 08.09.2014 (Пн) 15:41

Не очень понял, в какой пример и с какой целью это вставляется. В ландшафт? А как там управляется камера, не устраивает?

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

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

Сообщение PilatP » 08.09.2014 (Пн) 15:59

Mikle писал(а): А как там управляется камера, не устраивает?

Ты не так понял, управление камерой так и осталось,в твоем примере с шейдерами 3, я на основе него делаю редактор ландшафта,и я лиш добавил , режим, когда курсор не крутит камеру, а этот код нужен для определения позиции куда курсор на ландшафте показывает, в режиме когда, курсор в центре код работает, а когда в свободном движении по экрану, нет(при движении курсора по экрану, камера остается на месте)

у меня есть редактор ландшафта на 8, теперь переношу функционал, на 9, и так как по общему ходу еще и изучаю, на примерах, и врапер, и шейдеры, и многое другое

цель режима проста, когда курсор в центре я навожу на нужный участок ланда, и уже в режиме свободного курсора, редактирую ландшафт(поднимаю или опускаю участки ланда, просто в режиме свободного курсора это делать куда удобней)
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 08.09.2014 (Пн) 20:27

одну ошибку нашол
PilatP писал(а):не работает
Код: Выделить всё
k = Tan(fovy / 2)
        YY = (-(y / 15) / (ScrY / 2)) * k + k
        k = k / Aspect
        xx = ((x / 15) / (ScrX / 2)) * k - k

работает (х/15) в старом коде приводило к пикселю(мой бок)
Код: Выделить всё
k = Tan(fovy / 2)
        YY = (-(y) / (ScrY / 2)) * k + k
        k = k / Aspect
        xx = ((x ) / (ScrX / 2)) * k - k



предмет зашевелился, хотя не коректно, по Y все четко, а по X не порядок. во первых от центра отстает.
скину исходник, может глянеш https://yadi.sk/d/LkguI3MRbG4EL
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 08.09.2014 (Пн) 21:58

Завтра с утра на работе гляну. Дома интернет мобильный, много качать.
На вскидку - мог перепутать Aspect, он в DX9 и DX8 разный, в одном случае Width/Height, в другом Height/Width.

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

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

Сообщение Mikle » 09.09.2014 (Вт) 9:50

Тяжело разбираться в коде нерабочей программы :) Там же нет ни ландшафта, ни вообще визуальной 3D картинки.
Тот фрагмент кода, вычисляющий направление на курсор в 3D, я перевёл и упростил, исходя из того, что многое уже вычислено до этого.
Вот пример, кнопкой Ctrl переключаемся на режим свободного курсора:
https://yadi.sk/d/RyL6tV_pbHTAf

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

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

Сообщение PilatP » 09.09.2014 (Вт) 10:59

Код: Выделить всё

        MatrixInverse M1, 0, mView     
        Vec3TransformNormal v, v, M1   
        Vec3Add vDir, vDir, v           

Код: Выделить всё
        MatrixRotationX mDir, CamDiff
        MatrixRotationY mView, CamAngle
        MatrixMultiply mDir, mView, mDir
        MatrixTranspose mDir, mDir
        v = Vec3(xx, YY, 0)
        Vec3TransformCoord v, v, mDir
        Vec3Add vDir, vDir, v

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

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

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

Сообщение Mikle » 09.09.2014 (Вт) 13:00

Вот мой конвертер моделей. Я не делаю по несколько моделей в день, поэтому я не писал полноценную утилиту с диалогами загрузки-сохранения, опциями и т. п. Я прямо в коде подставляю нужное имя файла и выполняю прямо из среды VB6.
Кнопка View переключает режимы отображения. В Single режиме виден только сабсет, помеченный курсором (пунктирной рамкой), в Poly режиме отображаются все помеченные сабсеты.
При нажатии кнопки Save помеченные сабсеты сохраняются в .mesh файл.
У вас нет доступа для просмотра вложений в этом сообщении.

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

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

Сообщение The trick » 09.09.2014 (Вт) 13:28

Колесо можно обработать через сабклассинг, хук или через DirectInput - там как раз можно получить вращение на уровне события.
UA6527P

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

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

Сообщение Mikle » 09.09.2014 (Вт) 14:15

Кривоус Анатолий писал(а):Колесо можно обработать через сабклассинг, хук или через DirectInput

"сабклассинг, хук" - с этим я пока не связывался, а DirectInput вполне мог бы добавить в свой враппер, да не стал - вроде и через API устраивает.
Я как увидел, что ты ответил - думал, что ты разрулишь вот эту странную проблему:
viewtopic.php?f=6&t=45687&start=30#p6773842

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

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

Сообщение The trick » 09.09.2014 (Вт) 14:36

Mikle писал(а):Я как увидел, что ты ответил - думал, что ты разрулишь вот эту странную проблему:

Нужно вызвать SetDllDirectoryW StrPtr(App.path) в конструкторе класса.
UA6527P

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

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

Сообщение Mikle » 09.09.2014 (Вт) 16:01

Тфу ты, там всё просто, достаточно было выполнить ChDir App.Path.

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

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

Сообщение The trick » 09.09.2014 (Вт) 16:11

Mikle писал(а):Тфу ты, там всё просто, достаточно было выполнить ChDir App.Path.

Нет.
Изображение
UA6527P

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

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

Сообщение Mikle » 09.09.2014 (Вт) 16:30

Я это вписал в Cmd_txt1_Click после строки Dim B As Boolean - всё заработало. Похоже контрол меняет текущую директорию.

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

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

Сообщение The trick » 09.09.2014 (Вт) 16:32

Mikle писал(а):Похоже контрол меняет текущую директорию.

Я вызвал перед CopyMemory (см. скрин).
UA6527P

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2014 (Вт) 16:36

Mikle писал(а):Похоже контрол меняет текущую директорию.

OpenFileDialog? Да, насколько я помню.

Пред.След.

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

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

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

    TopList