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

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

Модератор: Mikle

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

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

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

это класс для текста, работает с dx9
можно ли как его ускорить

используется текстура

Код: Выделить всё
Dim RenX As Integer, RenY As Integer
Dim Bznak As Boolean

Private Type ConVFormat
  Pos As D3DVECTOR
  RHW As Single
  tU As Single
  tV As Single
End Type

Private Const ConFVF = D3DFVF_XYZRHW Or D3DFVF_TEX1



Public Sub draw_Text(Tex_id As Integer, Text As String, PosX As Single, PosY As Single, RazX As Single, RazY As Single, Optional xtSize As Single = 0)
Dim str As String, kol As Integer, Rend As Boolean, znak As String
  Dev.SetVertexShader Nothing
  Dev.SetPixelShader Nothing
 
  Dev.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
  Dev.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
  Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_TRUE
  Dev.SetRenderState D3DRS_TEXTUREFACTOR, &HFFFFF

 
  Dev.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
  Dev.SetRenderState D3DRS_ZENABLE, D3DZB_FALSE

  Dev.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1
  Dev.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
  Dev.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  Dev.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TFACTOR
  'Dev.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_TFACTOR
  Dev.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_DISABLE
  Bznak = False
  Dev.SetFVF ConFVF

    SizeX = RazX
    SizeY = RazY
    xSize = xtSize
    RenX = PosX
    RenY = PosY
    str = Text
    kol = Len(str)
    If (kol > 0) Then Rend = True
 
    Do While Rend
    DoEvents
    znak = Left(str, 1)
    kol = Len(str)
    If (kol = 0) Then
        Rend = False
    Else:
        str = Right(str, kol - 1)
        Sel_Znak znak
        If Bznak = False Then
            Dev.SetTexture 0, Tekstura(Tex_id).Textures
        Else:
            Dev.SetTexture 0, Tekstura(Font_simv_1).Textures
        End If

        Draw_znak xSize
    End If
  Loop

End Sub

Public Function Draw_znak(Optional xtSize As Single = 0)
 
  Vert(0).Pos = Vec3(RenX, RenY, 0.5)
  Vert(1).Pos = Vec3(RenX + SizeX, RenY, 0.5)
  Vert(2).Pos = Vec3(RenX, RenY + SizeY, 0.5)
  Vert(3).Pos = Vec3(RenX + SizeX, RenY + SizeY, 0.5)
 
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(Vert(0)), Len(Vert(0))
RenX = RenX + (SizeX - xtSize)
End Function





Private Sub Class_Initialize()
    Vert(0).RHW = 1
    Vert(0).tU = 0
    Vert(0).tV = 0
   
    Vert(1).RHW = 1
    Vert(1).tU = 1
    Vert(1).tV = 0
   
    Vert(2).RHW = 1
    Vert(2).tU = 0
    Vert(2).tV = 1
   
    Vert(3).RHW = 1
    Vert(3).tU = 1
    Vert(3).tV = 1
End Sub

Private Sub Sel_Znak(znak As String)
    Bznak = False
   
    Select Case znak
'///////////////////////////////////////////////////
        Case "A"
            Vert(0).tU = 0:  Vert(0).tV = 0
            Vert(1).tU = 0.06: Vert(1).tV = 0
            Vert(2).tU = 0: Vert(2).tV = 0.125
            Vert(3).tU = 0.06: Vert(3).tV = 0.125
        Case "B"
            Vert(0).tU = 0.06: Vert(0).tV = 0
            Vert(1).tU = 0.12: Vert(1).tV = 0
            Vert(2).tU = 0.06: Vert(2).tV = 0.125
            Vert(3).tU = 0.12:  Vert(3).tV = 0.125
        Case "C"
            Vert(0).tU = 0.118: Vert(0).tV = 0
            Vert(1).tU = 0.18: Vert(1).tV = 0
            Vert(2).tU = 0.118: Vert(2).tV = 0.125
            Vert(3).tU = 0.18:  Vert(3).tV = 0.125
        Case "D"
            Vert(0).tU = 0.177: Vert(0).tV = 0
            Vert(1).tU = 0.237: Vert(1).tV = 0
            Vert(2).tU = 0.177: Vert(2).tV = 0.125
            Vert(3).tU = 0.237:  Vert(3).tV = 0.125
        Case "E"
            Vert(0).tU = 0.235: Vert(0).tV = 0
            Vert(1).tU = 0.295: Vert(1).tV = 0
            Vert(2).tU = 0.235: Vert(2).tV = 0.125
            Vert(3).tU = 0.295:  Vert(3).tV = 0.125
        Case "F"
            Vert(0).tU = 0.294: Vert(0).tV = 0
            Vert(1).tU = 0.354: Vert(1).tV = 0
            Vert(2).tU = 0.294: Vert(2).tV = 0.125
            Vert(3).tU = 0.354:  Vert(3).tV = 0.125
        Case "G"
            Vert(0).tU = 0.352: Vert(0).tV = 0
            Vert(1).tU = 0.412: Vert(1).tV = 0
            Vert(2).tU = 0.352: Vert(2).tV = 0.125
            Vert(3).tU = 0.412:  Vert(3).tV = 0.125
        Case "H"
            Vert(0).tU = 0.41: Vert(0).tV = 0
            Vert(1).tU = 0.471: Vert(1).tV = 0
            Vert(2).tU = 0.41: Vert(2).tV = 0.125
            Vert(3).tU = 0.471:  Vert(3).tV = 0.125
        Case "I"
            Vert(0).tU = 0.469: Vert(0).tV = 0
            Vert(1).tU = 0.53: Vert(1).tV = 0
            Vert(2).tU = 0.469: Vert(2).tV = 0.125
            Vert(3).tU = 0.53:  Vert(3).tV = 0.125
        Case "J"
            Vert(0).tU = 0.529: Vert(0).tV = 0
            Vert(1).tU = 0.589: Vert(1).tV = 0
            Vert(2).tU = 0.529: Vert(2).tV = 0.125
            Vert(3).tU = 0.589:  Vert(3).tV = 0.125
        Case "K"
            Vert(0).tU = 0.587: Vert(0).tV = 0
            Vert(1).tU = 0.647: Vert(1).tV = 0
            Vert(2).tU = 0.587: Vert(2).tV = 0.125
            Vert(3).tU = 0.647:  Vert(3).tV = 0.125
        Case "L"
            Vert(0).tU = 0.646: Vert(0).tV = 0
            Vert(1).tU = 0.706: Vert(1).tV = 0
            Vert(2).tU = 0.646: Vert(2).tV = 0.125
            Vert(3).tU = 0.706:  Vert(3).tV = 0.125
        Case "M"
            Vert(0).tU = 0.704: Vert(0).tV = 0
            Vert(1).tU = 0.764: Vert(1).tV = 0
            Vert(2).tU = 0.704: Vert(2).tV = 0.125
            Vert(3).tU = 0.764:  Vert(3).tV = 0.125
        Case "N"
            Vert(0).tU = 0.762: Vert(0).tV = 0
            Vert(1).tU = 0.822: Vert(1).tV = 0
            Vert(2).tU = 0.762: Vert(2).tV = 0.125
            Vert(3).tU = 0.822:  Vert(3).tV = 0.125
        Case "O"
            Vert(0).tU = 0.822: Vert(0).tV = 0
            Vert(1).tU = 0.882: Vert(1).tV = 0
            Vert(2).tU = 0.822: Vert(2).tV = 0.125
            Vert(3).tU = 0.882:  Vert(3).tV = 0.125
        Case "P"
            Vert(0).tU = 0.88: Vert(0).tV = 0
            Vert(1).tU = 0.94: Vert(1).tV = 0
            Vert(2).tU = 0.88: Vert(2).tV = 0.125
            Vert(3).tU = 0.94:  Vert(3).tV = 0.125
        Case "Q"
            Vert(0).tU = 0.94: Vert(0).tV = 0
            Vert(1).tU = 1: Vert(1).tV = 0
            Vert(2).tU = 0.94: Vert(2).tV = 0.125
            Vert(3).tU = 1:  Vert(3).tV = 0.125
        Case "R"
            Vert(0).tU = 0: Vert(0).tV = 0.125
            Vert(1).tU = 0.062: Vert(1).tV = 0.125
            Vert(2).tU = 0: Vert(2).tV = 0.242
            Vert(3).tU = 0.062:  Vert(3).tV = 0.242
        Case "S"
            Vert(0).tU = 0.06: Vert(0).tV = 0.125
            Vert(1).tU = 0.12: Vert(1).tV = 0.125
            Vert(2).tU = 0.06: Vert(2).tV = 0.242
            Vert(3).tU = 0.12:  Vert(3).tV = 0.242
        Case "T"
            Vert(0).tU = 0.118: Vert(0).tV = 0.125
            Vert(1).tU = 0.18: Vert(1).tV = 0.125
            Vert(2).tU = 0.118: Vert(2).tV = 0.242
            Vert(3).tU = 0.18:  Vert(3).tV = 0.242
        Case "U"
            Vert(0).tU = 0.177: Vert(0).tV = 0.125
            Vert(1).tU = 0.237: Vert(1).tV = 0.125
            Vert(2).tU = 0.177: Vert(2).tV = 0.242
            Vert(3).tU = 0.237:  Vert(3).tV = 0.242
        Case "X"
            Vert(0).tU = 0.236: Vert(0).tV = 0.125
            Vert(1).tU = 0.296: Vert(1).tV = 0.125
            Vert(2).tU = 0.236: Vert(2).tV = 0.242
            Vert(3).tU = 0.296:  Vert(3).tV = 0.242
        Case "Y"
            Vert(0).tU = 0.294: Vert(0).tV = 0.125
            Vert(1).tU = 0.354: Vert(1).tV = 0.125
            Vert(2).tU = 0.294: Vert(2).tV = 0.242
            Vert(3).tU = 0.354:  Vert(3).tV = 0.242
        Case "Z"
            Vert(0).tU = 0.352: Vert(0).tV = 0.125
            Vert(1).tU = 0.412: Vert(1).tV = 0.125
            Vert(2).tU = 0.352: Vert(2).tV = 0.242
            Vert(3).tU = 0.412:  Vert(3).tV = 0.242
        Case " "
            Vert(0).tU = 0.412: Vert(0).tV = 0.125
            Vert(1).tU = 0.472: Vert(1).tV = 0.125
            Vert(2).tU = 0.412: Vert(2).tV = 0.242
            Vert(3).tU = 0.472:  Vert(3).tV = 0.242
       
       
'///////////////////////////////////////////////////
       
        Case "a"
            Vert(0).tU = 0.001: Vert(0).tV = 0.242
            Vert(1).tU = 0.061: Vert(1).tV = 0.242
            Vert(2).tU = 0.001: Vert(2).tV = 0.365
            Vert(3).tU = 0.061: Vert(3).tV = 0.365
        Case "b"
            Vert(0).tU = 0.06: Vert(0).tV = 0.242
            Vert(1).tU = 0.12: Vert(1).tV = 0.242
            Vert(2).tU = 0.06: Vert(2).tV = 0.365
            Vert(3).tU = 0.12:  Vert(3).tV = 0.365
        Case "c"
            Vert(0).tU = 0.118: Vert(0).tV = 0.242
            Vert(1).tU = 0.18: Vert(1).tV = 0.242
            Vert(2).tU = 0.118: Vert(2).tV = 0.365
            Vert(3).tU = 0.18:  Vert(3).tV = 0.365
        Case "d"
            Vert(0).tU = 0.177: Vert(0).tV = 0.242
            Vert(1).tU = 0.237: Vert(1).tV = 0.242
            Vert(2).tU = 0.177: Vert(2).tV = 0.365
            Vert(3).tU = 0.237:  Vert(3).tV = 0.365
        Case "e"
            Vert(0).tU = 0.235: Vert(0).tV = 0.242
            Vert(1).tU = 0.295: Vert(1).tV = 0.242
            Vert(2).tU = 0.235: Vert(2).tV = 0.365
            Vert(3).tU = 0.295:  Vert(3).tV = 0.365
        Case "f"
            Vert(0).tU = 0.294: Vert(0).tV = 0.242
            Vert(1).tU = 0.354: Vert(1).tV = 0.242
            Vert(2).tU = 0.294: Vert(2).tV = 0.365
            Vert(3).tU = 0.354:  Vert(3).tV = 0.365
        Case "g"
            Vert(0).tU = 0.352: Vert(0).tV = 0.242
            Vert(1).tU = 0.412: Vert(1).tV = 0.242
            Vert(2).tU = 0.352: Vert(2).tV = 0.365
            Vert(3).tU = 0.412:  Vert(3).tV = 0.365
        Case "h"
            Vert(0).tU = 0.41: Vert(0).tV = 0.242
            Vert(1).tU = 0.471: Vert(1).tV = 0.242
            Vert(2).tU = 0.41: Vert(2).tV = 0.365
            Vert(3).tU = 0.471:  Vert(3).tV = 0.365
        Case "i"
            Vert(0).tU = 0.469: Vert(0).tV = 0.242
            Vert(1).tU = 0.53: Vert(1).tV = 0.242
            Vert(2).tU = 0.469: Vert(2).tV = 0.365
            Vert(3).tU = 0.53:  Vert(3).tV = 0.365
        Case "j"
            Vert(0).tU = 0.529: Vert(0).tV = 0.242
            Vert(1).tU = 0.589: Vert(1).tV = 0.242
            Vert(2).tU = 0.529: Vert(2).tV = 0.365
            Vert(3).tU = 0.589:  Vert(3).tV = 0.365
        Case "k"
            Vert(0).tU = 0.587: Vert(0).tV = 0.242
            Vert(1).tU = 0.647: Vert(1).tV = 0.242
            Vert(2).tU = 0.587: Vert(2).tV = 0.365
            Vert(3).tU = 0.647:  Vert(3).tV = 0.365
        Case "l"
            Vert(0).tU = 0.646: Vert(0).tV = 0.242
            Vert(1).tU = 0.706: Vert(1).tV = 0.242
            Vert(2).tU = 0.646: Vert(2).tV = 0.365
            Vert(3).tU = 0.706:  Vert(3).tV = 0.365
        Case "m"
            Vert(0).tU = 0.704: Vert(0).tV = 0.242
            Vert(1).tU = 0.764: Vert(1).tV = 0.242
            Vert(2).tU = 0.704: Vert(2).tV = 0.365
            Vert(3).tU = 0.764:  Vert(3).tV = 0.365
        Case "n"
            Vert(0).tU = 0.762: Vert(0).tV = 0.242
            Vert(1).tU = 0.822: Vert(1).tV = 0.242
            Vert(2).tU = 0.762: Vert(2).tV = 0.365
            Vert(3).tU = 0.822:  Vert(3).tV = 0.365
        Case "o"
            Vert(0).tU = 0.822: Vert(0).tV = 0.242
            Vert(1).tU = 0.882: Vert(1).tV = 0.242
            Vert(2).tU = 0.822: Vert(2).tV = 0.365
            Vert(3).tU = 0.882:  Vert(3).tV = 0.365
        Case "p"
            Vert(0).tU = 0.88: Vert(0).tV = 0.242
            Vert(1).tU = 0.94: Vert(1).tV = 0.242
            Vert(2).tU = 0.88: Vert(2).tV = 0.365
            Vert(3).tU = 0.94:  Vert(3).tV = 0.365
        Case "q"
            Vert(0).tU = 0.94: Vert(0).tV = 0.242
            Vert(1).tU = 1: Vert(1).tV = 0.242
            Vert(2).tU = 0.94: Vert(2).tV = 0.365
            Vert(3).tU = 1:  Vert(3).tV = 0.365
        Case "r"
            Vert(0).tU = 0: Vert(0).tV = 0.358
            Vert(1).tU = 0.062: Vert(1).tV = 0.358
            Vert(2).tU = 0: Vert(2).tV = 0.478
            Vert(3).tU = 0.062:  Vert(3).tV = 0.478
        Case "s"
            Vert(0).tU = 0.06: Vert(0).tV = 0.358
            Vert(1).tU = 0.12: Vert(1).tV = 0.358
            Vert(2).tU = 0.06: Vert(2).tV = 0.478
            Vert(3).tU = 0.12:  Vert(3).tV = 0.478
        Case "t"
            Vert(0).tU = 0.118: Vert(0).tV = 0.358
            Vert(1).tU = 0.178: Vert(1).tV = 0.358
            Vert(2).tU = 0.118: Vert(2).tV = 0.478
            Vert(3).tU = 0.178:  Vert(3).tV = 0.478
        Case "u"
            Vert(0).tU = 0.177: Vert(0).tV = 0.358
            Vert(1).tU = 0.237: Vert(1).tV = 0.358
            Vert(2).tU = 0.177: Vert(2).tV = 0.478
            Vert(3).tU = 0.237:  Vert(3).tV = 0.478
        Case "x"
            Vert(0).tU = 0.235: Vert(0).tV = 0.358
            Vert(1).tU = 0.295: Vert(1).tV = 0.358
            Vert(2).tU = 0.235: Vert(2).tV = 0.478
            Vert(3).tU = 0.295:  Vert(3).tV = 0.478
        Case "y"
            Vert(0).tU = 0.294: Vert(0).tV = 0.358
            Vert(1).tU = 0.354: Vert(1).tV = 0.358
            Vert(2).tU = 0.294: Vert(2).tV = 0.478
            Vert(3).tU = 0.354:  Vert(3).tV = 0.478
        Case "z"
            Vert(0).tU = 0.352: Vert(0).tV = 0.358
            Vert(1).tU = 0.412: Vert(1).tV = 0.358
            Vert(2).tU = 0.352: Vert(2).tV = 0.478
            Vert(3).tU = 0.412:  Vert(3).tV = 0.478
           
           
'///////////////////////////////////////////////////
           
         Case "À"
            Vert(0).tU = 0.001: Vert(0).tV = 0.475
            Vert(1).tU = 0.061: Vert(1).tV = 0.475
            Vert(2).tU = 0.001: Vert(2).tV = 0.595
            Vert(3).tU = 0.061: Vert(3).tV = 0.595
        Case "Á"
            Vert(0).tU = 0.06: Vert(0).tV = 0.475
            Vert(1).tU = 0.12: Vert(1).tV = 0.475
            Vert(2).tU = 0.06: Vert(2).tV = 0.595
            Vert(3).tU = 0.12:  Vert(3).tV = 0.595
        Case "Â"
            Vert(0).tU = 0.118: Vert(0).tV = 0.475
            Vert(1).tU = 0.18: Vert(1).tV = 0.475
            Vert(2).tU = 0.118: Vert(2).tV = 0.595
            Vert(3).tU = 0.18:  Vert(3).tV = 0.595
        Case "Ã"
            Vert(0).tU = 0.177: Vert(0).tV = 0.475
            Vert(1).tU = 0.237: Vert(1).tV = 0.475
            Vert(2).tU = 0.177: Vert(2).tV = 0.595
            Vert(3).tU = 0.237:  Vert(3).tV = 0.595
        Case "Ä"
            Vert(0).tU = 0.235: Vert(0).tV = 0.475
            Vert(1).tU = 0.295: Vert(1).tV = 0.475
            Vert(2).tU = 0.235: Vert(2).tV = 0.595
            Vert(3).tU = 0.295:  Vert(3).tV = 0.595
        Case "Å"
            Vert(0).tU = 0.294: Vert(0).tV = 0.475
            Vert(1).tU = 0.354: Vert(1).tV = 0.475
            Vert(2).tU = 0.294: Vert(2).tV = 0.595
            Vert(3).tU = 0.354:  Vert(3).tV = 0.595
        Case "¨"
            Vert(0).tU = 0.352: Vert(0).tV = 0.475
            Vert(1).tU = 0.412: Vert(1).tV = 0.475
            Vert(2).tU = 0.352: Vert(2).tV = 0.595
            Vert(3).tU = 0.412:  Vert(3).tV = 0.595
        Case "Æ"
            Vert(0).tU = 0.41: Vert(0).tV = 0.475
            Vert(1).tU = 0.471: Vert(1).tV = 0.475
            Vert(2).tU = 0.41: Vert(2).tV = 0.595
            Vert(3).tU = 0.471:  Vert(3).tV = 0.595
        Case "Ç"
            Vert(0).tU = 0.469: Vert(0).tV = 0.475
            Vert(1).tU = 0.53: Vert(1).tV = 0.475
            Vert(2).tU = 0.469: Vert(2).tV = 0.595
            Vert(3).tU = 0.53:  Vert(3).tV = 0.595
        Case "È"
            Vert(0).tU = 0.529: Vert(0).tV = 0.475
            Vert(1).tU = 0.589: Vert(1).tV = 0.475
            Vert(2).tU = 0.529: Vert(2).tV = 0.595
            Vert(3).tU = 0.589:  Vert(3).tV = 0.595
        Case "É"
            Vert(0).tU = 0.587: Vert(0).tV = 0.475
            Vert(1).tU = 0.647: Vert(1).tV = 0.475
            Vert(2).tU = 0.587: Vert(2).tV = 0.595
            Vert(3).tU = 0.647:  Vert(3).tV = 0.595
        Case "Ê"
            Vert(0).tU = 0.646: Vert(0).tV = 0.475
            Vert(1).tU = 0.706: Vert(1).tV = 0.475
            Vert(2).tU = 0.646: Vert(2).tV = 0.595
            Vert(3).tU = 0.706:  Vert(3).tV = 0.595
        Case "Ë"
            Vert(0).tU = 0.704: Vert(0).tV = 0.475
            Vert(1).tU = 0.764: Vert(1).tV = 0.475
            Vert(2).tU = 0.704: Vert(2).tV = 0.595
            Vert(3).tU = 0.764:  Vert(3).tV = 0.595
        Case "Ì"
            Vert(0).tU = 0.762: Vert(0).tV = 0.475
            Vert(1).tU = 0.822: Vert(1).tV = 0.475
            Vert(2).tU = 0.762: Vert(2).tV = 0.595
            Vert(3).tU = 0.822:  Vert(3).tV = 0.595
        Case "Í"
            Vert(0).tU = 0.822: Vert(0).tV = 0.475
            Vert(1).tU = 0.882: Vert(1).tV = 0.475
            Vert(2).tU = 0.822: Vert(2).tV = 0.595
            Vert(3).tU = 0.882:  Vert(3).tV = 0.595
        Case "Î"
            Vert(0).tU = 0.88: Vert(0).tV = 0.475
            Vert(1).tU = 0.94: Vert(1).tV = 0.475
            Vert(2).tU = 0.88: Vert(2).tV = 0.595
            Vert(3).tU = 0.94:  Vert(3).tV = 0.595
        Case "Ï"
            Vert(0).tU = 0.94: Vert(0).tV = 0.475
            Vert(1).tU = 1: Vert(1).tV = 0.475
            Vert(2).tU = 0.94: Vert(2).tV = 0.595
            Vert(3).tU = 1:  Vert(3).tV = 0.595
        Case "Ð"
            Vert(0).tU = 0: Vert(0).tV = 0.595
            Vert(1).tU = 0.062: Vert(1).tV = 0.595
            Vert(2).tU = 0: Vert(2).tV = 0.72
            Vert(3).tU = 0.062:  Vert(3).tV = 0.72
        Case "Ñ"
            Vert(0).tU = 0.06: Vert(0).tV = 0.595
            Vert(1).tU = 0.12: Vert(1).tV = 0.595
            Vert(2).tU = 0.06: Vert(2).tV = 0.72
            Vert(3).tU = 0.12:  Vert(3).tV = 0.72
        Case "Ò"
            Vert(0).tU = 0.118: Vert(0).tV = 0.595
            Vert(1).tU = 0.18: Vert(1).tV = 0.595
            Vert(2).tU = 0.118: Vert(2).tV = 0.72
            Vert(3).tU = 0.18:  Vert(3).tV = 0.72
        Case "Ó"
            Vert(0).tU = 0.177: Vert(0).tV = 0.595
            Vert(1).tU = 0.237: Vert(1).tV = 0.595
            Vert(2).tU = 0.177: Vert(2).tV = 0.72
            Vert(3).tU = 0.237:  Vert(3).tV = 0.72
        Case "Ô"
            Vert(0).tU = 0.236: Vert(0).tV = 0.595
            Vert(1).tU = 0.296: Vert(1).tV = 0.595
            Vert(2).tU = 0.236: Vert(2).tV = 0.72
            Vert(3).tU = 0.296:  Vert(3).tV = 0.72
        Case "Õ"
            Vert(0).tU = 0.294: Vert(0).tV = 0.595
            Vert(1).tU = 0.354: Vert(1).tV = 0.595
            Vert(2).tU = 0.294: Vert(2).tV = 0.72
            Vert(3).tU = 0.354:  Vert(3).tV = 0.72
        Case "Ö"
            Vert(0).tU = 0.352: Vert(0).tV = 0.595
            Vert(1).tU = 0.412: Vert(1).tV = 0.595
            Vert(2).tU = 0.352: Vert(2).tV = 0.72
            Vert(3).tU = 0.412:  Vert(3).tV = 0.72
           
         Case "×"
            Vert(0).tU = 0.412: Vert(0).tV = 0.595
            Vert(1).tU = 0.472: Vert(1).tV = 0.595
            Vert(2).tU = 0.412: Vert(2).tV = 0.72
            Vert(3).tU = 0.472:  Vert(3).tV = 0.72
        Case "Ø"
            Vert(0).tU = 0.47: Vert(0).tV = 0.595
            Vert(1).tU = 0.53: Vert(1).tV = 0.595
            Vert(2).tU = 0.47: Vert(2).tV = 0.72
            Vert(3).tU = 0.53:  Vert(3).tV = 0.72
        Case "Ù"
            Vert(0).tU = 0.528: Vert(0).tV = 0.595
            Vert(1).tU = 0.588: Vert(1).tV = 0.595
            Vert(2).tU = 0.528: Vert(2).tV = 0.72
            Vert(3).tU = 0.588:  Vert(3).tV = 0.72
        Case "Ú"
            Vert(0).tU = 0.587: Vert(0).tV = 0.595
            Vert(1).tU = 0.647: Vert(1).tV = 0.595
            Vert(2).tU = 0.587: Vert(2).tV = 0.72
            Vert(3).tU = 0.647:  Vert(3).tV = 0.72
        Case "Û"
            Vert(0).tU = 0.645: Vert(0).tV = 0.595
            Vert(1).tU = 0.705: Vert(1).tV = 0.595
            Vert(2).tU = 0.645: Vert(2).tV = 0.72
            Vert(3).tU = 0.705:  Vert(3).tV = 0.72
        Case "Ü"
            Vert(0).tU = 0.704: Vert(0).tV = 0.595
            Vert(1).tU = 0.764: Vert(1).tV = 0.595
            Vert(2).tU = 0.704: Vert(2).tV = 0.72
            Vert(3).tU = 0.764:  Vert(3).tV = 0.72
        Case "Ý"
            Vert(0).tU = 0.762: Vert(0).tV = 0.595
            Vert(1).tU = 0.822: Vert(1).tV = 0.595
            Vert(2).tU = 0.762: Vert(2).tV = 0.72
            Vert(3).tU = 0.822:  Vert(3).tV = 0.72
        Case "Þ"
            Vert(0).tU = 0.822: Vert(0).tV = 0.595
            Vert(1).tU = 0.882: Vert(1).tV = 0.595
            Vert(2).tU = 0.822: Vert(2).tV = 0.72
            Vert(3).tU = 0.882:  Vert(3).tV = 0.72
        Case "ß"
            Vert(0).tU = 0.88: Vert(0).tV = 0.595
            Vert(1).tU = 0.94: Vert(1).tV = 0.595
            Vert(2).tU = 0.88: Vert(2).tV = 0.72
            Vert(3).tU = 0.94:  Vert(3).tV = 0.72
         
'///////////////////////////////////////////////////
         Case "à"
            Vert(0).tU = 0.001: Vert(0).tV = 0.71
            Vert(1).tU = 0.061: Vert(1).tV = 0.71
            Vert(2).tU = 0.001: Vert(2).tV = 0.835
            Vert(3).tU = 0.061: Vert(3).tV = 0.835
        Case "á"
            Vert(0).tU = 0.06: Vert(0).tV = 0.71
            Vert(1).tU = 0.12: Vert(1).tV = 0.71
            Vert(2).tU = 0.06: Vert(2).tV = 0.835
            Vert(3).tU = 0.12:  Vert(3).tV = 0.835
        Case "â"
            Vert(0).tU = 0.118: Vert(0).tV = 0.71
            Vert(1).tU = 0.18: Vert(1).tV = 0.71
            Vert(2).tU = 0.118: Vert(2).tV = 0.835
            Vert(3).tU = 0.18:  Vert(3).tV = 0.835
        Case "ã"
            Vert(0).tU = 0.177: Vert(0).tV = 0.71
            Vert(1).tU = 0.237: Vert(1).tV = 0.71
            Vert(2).tU = 0.177: Vert(2).tV = 0.835
            Vert(3).tU = 0.237:  Vert(3).tV = 0.835
        Case "ä"
            Vert(0).tU = 0.235: Vert(0).tV = 0.71
            Vert(1).tU = 0.295: Vert(1).tV = 0.71
            Vert(2).tU = 0.235: Vert(2).tV = 0.835
            Vert(3).tU = 0.295:  Vert(3).tV = 0.835
        Case "å"
            Vert(0).tU = 0.294: Vert(0).tV = 0.71
            Vert(1).tU = 0.354: Vert(1).tV = 0.71
            Vert(2).tU = 0.294: Vert(2).tV = 0.835
            Vert(3).tU = 0.354:  Vert(3).tV = 0.835
        Case "¸"
            Vert(0).tU = 0.352: Vert(0).tV = 0.71
            Vert(1).tU = 0.412: Vert(1).tV = 0.71
            Vert(2).tU = 0.352: Vert(2).tV = 0.835
            Vert(3).tU = 0.412:  Vert(3).tV = 0.835
        Case "æ"
            Vert(0).tU = 0.41: Vert(0).tV = 0.71
            Vert(1).tU = 0.471: Vert(1).tV = 0.71
            Vert(2).tU = 0.41: Vert(2).tV = 0.835
            Vert(3).tU = 0.471:  Vert(3).tV = 0.835
        Case "ç"
            Vert(0).tU = 0.469: Vert(0).tV = 0.71
            Vert(1).tU = 0.53: Vert(1).tV = 0.71
            Vert(2).tU = 0.469: Vert(2).tV = 0.835
            Vert(3).tU = 0.53:  Vert(3).tV = 0.835
        Case "è"
            Vert(0).tU = 0.529: Vert(0).tV = 0.71
            Vert(1).tU = 0.589: Vert(1).tV = 0.71
            Vert(2).tU = 0.529: Vert(2).tV = 0.835
            Vert(3).tU = 0.589:  Vert(3).tV = 0.835
        Case "é"
            Vert(0).tU = 0.587: Vert(0).tV = 0.71
            Vert(1).tU = 0.647: Vert(1).tV = 0.71
            Vert(2).tU = 0.587: Vert(2).tV = 0.835
            Vert(3).tU = 0.647:  Vert(3).tV = 0.835
        Case "ê"
            Vert(0).tU = 0.646: Vert(0).tV = 0.71
            Vert(1).tU = 0.706: Vert(1).tV = 0.71
            Vert(2).tU = 0.646: Vert(2).tV = 0.835
            Vert(3).tU = 0.706:  Vert(3).tV = 0.835
        Case "ë"
            Vert(0).tU = 0.704: Vert(0).tV = 0.71
            Vert(1).tU = 0.764: Vert(1).tV = 0.71
            Vert(2).tU = 0.704: Vert(2).tV = 0.835
            Vert(3).tU = 0.764:  Vert(3).tV = 0.835
        Case "ì"
            Vert(0).tU = 0.762: Vert(0).tV = 0.71
            Vert(1).tU = 0.822: Vert(1).tV = 0.71
            Vert(2).tU = 0.762: Vert(2).tV = 0.835
            Vert(3).tU = 0.822:  Vert(3).tV = 0.835
        Case "í"
            Vert(0).tU = 0.822: Vert(0).tV = 0.71
            Vert(1).tU = 0.882: Vert(1).tV = 0.71
            Vert(2).tU = 0.822: Vert(2).tV = 0.835
            Vert(3).tU = 0.882:  Vert(3).tV = 0.835
        Case "î"
            Vert(0).tU = 0.88: Vert(0).tV = 0.71
            Vert(1).tU = 0.94: Vert(1).tV = 0.71
            Vert(2).tU = 0.88: Vert(2).tV = 0.835
            Vert(3).tU = 0.94:  Vert(3).tV = 0.835
        Case "ï"
            Vert(0).tU = 0.94: Vert(0).tV = 0.71
            Vert(1).tU = 1: Vert(1).tV = 0.71
            Vert(2).tU = 0.94: Vert(2).tV = 0.835
            Vert(3).tU = 1:  Vert(3).tV = 0.835
        Case "ð"
            Vert(0).tU = 0: Vert(0).tV = 0.83
            Vert(1).tU = 0.062: Vert(1).tV = 0.83
            Vert(2).tU = 0: Vert(2).tV = 0.95
            Vert(3).tU = 0.062:  Vert(3).tV = 0.95
        Case "ñ"
            Vert(0).tU = 0.06: Vert(0).tV = 0.83
            Vert(1).tU = 0.12: Vert(1).tV = 0.83
            Vert(2).tU = 0.06: Vert(2).tV = 0.95
            Vert(3).tU = 0.12:  Vert(3).tV = 0.95
        Case "ò"
            Vert(0).tU = 0.118: Vert(0).tV = 0.83
            Vert(1).tU = 0.18: Vert(1).tV = 0.83
            Vert(2).tU = 0.118: Vert(2).tV = 0.95
            Vert(3).tU = 0.18:  Vert(3).tV = 0.95
        Case "ó"
            Vert(0).tU = 0.177: Vert(0).tV = 0.83
            Vert(1).tU = 0.237: Vert(1).tV = 0.83
            Vert(2).tU = 0.177: Vert(2).tV = 0.95
            Vert(3).tU = 0.237:  Vert(3).tV = 0.95
        Case "ô"
            Vert(0).tU = 0.236: Vert(0).tV = 0.83
            Vert(1).tU = 0.296: Vert(1).tV = 0.83
            Vert(2).tU = 0.236: Vert(2).tV = 0.95
            Vert(3).tU = 0.296:  Vert(3).tV = 0.95
        Case "õ"
            Vert(0).tU = 0.294: Vert(0).tV = 0.83
            Vert(1).tU = 0.354: Vert(1).tV = 0.83
            Vert(2).tU = 0.294: Vert(2).tV = 0.95
            Vert(3).tU = 0.354:  Vert(3).tV = 0.95
        Case "ö"
            Vert(0).tU = 0.352: Vert(0).tV = 0.83
            Vert(1).tU = 0.412: Vert(1).tV = 0.83
            Vert(2).tU = 0.352: Vert(2).tV = 0.95
            Vert(3).tU = 0.412:  Vert(3).tV = 0.95
           
         Case "÷"
            Vert(0).tU = 0.412: Vert(0).tV = 0.83
            Vert(1).tU = 0.472: Vert(1).tV = 0.83
            Vert(2).tU = 0.412: Vert(2).tV = 0.95
            Vert(3).tU = 0.472:  Vert(3).tV = 0.95
        Case "ø"
            Vert(0).tU = 0.47: Vert(0).tV = 0.83
            Vert(1).tU = 0.53: Vert(1).tV = 0.83
            Vert(2).tU = 0.47: Vert(2).tV = 0.95
            Vert(3).tU = 0.53:  Vert(3).tV = 0.95
        Case "ù"
            Vert(0).tU = 0.528: Vert(0).tV = 0.83
            Vert(1).tU = 0.588: Vert(1).tV = 0.83
            Vert(2).tU = 0.528: Vert(2).tV = 0.95
            Vert(3).tU = 0.588:  Vert(3).tV = 0.95
        Case "ú"
            Vert(0).tU = 0.587: Vert(0).tV = 0.83
            Vert(1).tU = 0.647: Vert(1).tV = 0.83
            Vert(2).tU = 0.587: Vert(2).tV = 0.95
            Vert(3).tU = 0.647:  Vert(3).tV = 0.95
        Case "û"
            Vert(0).tU = 0.645: Vert(0).tV = 0.83
            Vert(1).tU = 0.705: Vert(1).tV = 0.83
            Vert(2).tU = 0.645: Vert(2).tV = 0.95
            Vert(3).tU = 0.705:  Vert(3).tV = 0.95
        Case "ü"
            Vert(0).tU = 0.704: Vert(0).tV = 0.83
            Vert(1).tU = 0.764: Vert(1).tV = 0.83
            Vert(2).tU = 0.704: Vert(2).tV = 0.95
            Vert(3).tU = 0.764:  Vert(3).tV = 0.95
        Case "ý"
            Vert(0).tU = 0.762: Vert(0).tV = 0.83
            Vert(1).tU = 0.822: Vert(1).tV = 0.83
            Vert(2).tU = 0.762: Vert(2).tV = 0.95
            Vert(3).tU = 0.822:  Vert(3).tV = 0.95
        Case "þ"
            Vert(0).tU = 0.822: Vert(0).tV = 0.83
            Vert(1).tU = 0.882: Vert(1).tV = 0.83
            Vert(2).tU = 0.822: Vert(2).tV = 0.95
            Vert(3).tU = 0.882:  Vert(3).tV = 0.95
        Case "ÿ"
            Vert(0).tU = 0.88: Vert(0).tV = 0.83
            Vert(1).tU = 0.94: Vert(1).tV = 0.83
            Vert(2).tU = 0.88: Vert(2).tV = 0.95
            Vert(3).tU = 0.94:  Vert(3).tV = 0.95
       
       
       
        Case "0"
            Bznak = True
            Vert(0).tU = 0:  Vert(0).tV = 0
            Vert(1).tU = 0.06: Vert(1).tV = 0
            Vert(2).tU = 0: Vert(2).tV = 0.125
            Vert(3).tU = 0.06: Vert(3).tV = 0.125
        Case "1"
            Bznak = True
            Vert(0).tU = 0.06: Vert(0).tV = 0
            Vert(1).tU = 0.12: Vert(1).tV = 0
            Vert(2).tU = 0.06: Vert(2).tV = 0.125
            Vert(3).tU = 0.12:  Vert(3).tV = 0.125
        Case "2"
            Bznak = True
            Vert(0).tU = 0.118: Vert(0).tV = 0
            Vert(1).tU = 0.18: Vert(1).tV = 0
            Vert(2).tU = 0.118: Vert(2).tV = 0.125
            Vert(3).tU = 0.18:  Vert(3).tV = 0.125
        Case "3"
            Bznak = True
            Vert(0).tU = 0.177: Vert(0).tV = 0
            Vert(1).tU = 0.237: Vert(1).tV = 0
            Vert(2).tU = 0.177: Vert(2).tV = 0.125
            Vert(3).tU = 0.237:  Vert(3).tV = 0.125
        Case "4"
            Bznak = True
            Vert(0).tU = 0.235: Vert(0).tV = 0
            Vert(1).tU = 0.295: Vert(1).tV = 0
            Vert(2).tU = 0.235: Vert(2).tV = 0.125
            Vert(3).tU = 0.295:  Vert(3).tV = 0.125
        Case "5"
            Bznak = True
            Vert(0).tU = 0.294: Vert(0).tV = 0
            Vert(1).tU = 0.354: Vert(1).tV = 0
            Vert(2).tU = 0.294: Vert(2).tV = 0.125
            Vert(3).tU = 0.354:  Vert(3).tV = 0.125
        Case "6"
            Bznak = True
            Vert(0).tU = 0.352: Vert(0).tV = 0
            Vert(1).tU = 0.412: Vert(1).tV = 0
            Vert(2).tU = 0.352: Vert(2).tV = 0.125
            Vert(3).tU = 0.412:  Vert(3).tV = 0.125
        Case "7"
            Bznak = True
            Vert(0).tU = 0.41: Vert(0).tV = 0
            Vert(1).tU = 0.471: Vert(1).tV = 0
            Vert(2).tU = 0.41: Vert(2).tV = 0.125
            Vert(3).tU = 0.471:  Vert(3).tV = 0.125
        Case "8"
            Bznak = True
            Vert(0).tU = 0.469: Vert(0).tV = 0
            Vert(1).tU = 0.53: Vert(1).tV = 0
            Vert(2).tU = 0.469: Vert(2).tV = 0.125
            Vert(3).tU = 0.53:  Vert(3).tV = 0.125
        Case "9"
            Bznak = True
            Vert(0).tU = 0.529: Vert(0).tV = 0
            Vert(1).tU = 0.589: Vert(1).tV = 0
            Vert(2).tU = 0.529: Vert(2).tV = 0.125
            Vert(3).tU = 0.589:  Vert(3).tV = 0.125
           
           
           
        'Case "`1"
        '    Vert(0).tu = 0.587: Vert(0).tv = 0
        '    Vert(1).tu = 0.647: Vert(1).tv = 0
        '    Vert(2).tu = 0.587: Vert(2).tv = 0.125
        '    Vert(3).tu = 0.647:  Vert(3).tv = 0.125
        'Case "`2"
        '    Vert(0).tu = 0.646: Vert(0).tv = 0
        '    Vert(1).tu = 0.706: Vert(1).tv = 0
        '   Vert(2).tu = 0.646: Vert(2).tv = 0.125
       '     Vert(3).tu = 0.706:  Vert(3).tv = 0.125
       ' Case "`3"
       '     Vert(0).tu = 0.704: Vert(0).tv = 0
       '     Vert(1).tu = 0.764: Vert(1).tv = 0
       '     Vert(2).tu = 0.704: Vert(2).tv = 0.125
       '     Vert(3).tu = 0.764:  Vert(3).tv = 0.125
       ' Case "`4"
       '     Vert(0).tu = 0.762: Vert(0).tv = 0
       '     Vert(1).tu = 0.822: Vert(1).tv = 0
       '     Vert(2).tu = 0.762: Vert(2).tv = 0.125
       '     Vert(3).tu = 0.822:  Vert(3).tv = 0.125
       ' Case "`5"
       '     Vert(0).tu = 0.822: Vert(0).tv = 0
       '     Vert(1).tu = 0.882: Vert(1).tv = 0
       '     Vert(2).tu = 0.822: Vert(2).tv = 0.125
       '     Vert(3).tu = 0.882:  Vert(3).tv = 0.125
       ' Case "`6"
       '     Vert(0).tu = 0.88: Vert(0).tv = 0
       '     Vert(1).tu = 0.94: Vert(1).tv = 0
       '     Vert(2).tu = 0.88: Vert(2).tv = 0.125
       '     Vert(3).tu = 0.94:  Vert(3).tv = 0.125
       ' Case "`7"
       '     Vert(0).tu = 0.94: Vert(0).tv = 0
       '     Vert(1).tu = 1: Vert(1).tv = 0
       '     Vert(2).tu = 0.94: Vert(2).tv = 0.125
       '     Vert(3).tu = 1:  Vert(3).tv = 0.125
       '
     '///////
        Case "~"
            Bznak = True
            Vert(0).tU = 0: Vert(0).tV = 0.125
            Vert(1).tU = 0.062: Vert(1).tV = 0.125
            Vert(2).tU = 0: Vert(2).tV = 0.242
            Vert(3).tU = 0.062:  Vert(3).tV = 0.242
        Case "!"
            Bznak = True
            Vert(0).tU = 0.06: Vert(0).tV = 0.125
            Vert(1).tU = 0.12: Vert(1).tV = 0.125
            Vert(2).tU = 0.06: Vert(2).tV = 0.242
            Vert(3).tU = 0.12:  Vert(3).tV = 0.242
        Case "@"
            Bznak = True
            Vert(0).tU = 0.118: Vert(0).tV = 0.125
            Vert(1).tU = 0.18: Vert(1).tV = 0.125
            Vert(2).tU = 0.118: Vert(2).tV = 0.242
            Vert(3).tU = 0.18:  Vert(3).tV = 0.242
        Case "#"
            Bznak = True
            Vert(0).tU = 0.177: Vert(0).tV = 0.125
            Vert(1).tU = 0.237: Vert(1).tV = 0.125
            Vert(2).tU = 0.177: Vert(2).tV = 0.242
            Vert(3).tU = 0.237:  Vert(3).tV = 0.242
        Case "$"
            Bznak = True
            Vert(0).tU = 0.236: Vert(0).tV = 0.125
            Vert(1).tU = 0.296: Vert(1).tV = 0.125
            Vert(2).tU = 0.236: Vert(2).tV = 0.242
            Vert(3).tU = 0.296:  Vert(3).tV = 0.242
        Case "%"
            Bznak = True
            Vert(0).tU = 0.294: Vert(0).tV = 0.125
            Vert(1).tU = 0.354: Vert(1).tV = 0.125
            Vert(2).tU = 0.294: Vert(2).tV = 0.242
            Vert(3).tU = 0.354:  Vert(3).tV = 0.242
        Case "^"
            Bznak = True
            Vert(0).tU = 0.352: Vert(0).tV = 0.125
            Vert(1).tU = 0.412: Vert(1).tV = 0.125
            Vert(2).tU = 0.352: Vert(2).tV = 0.242
            Vert(3).tU = 0.412:  Vert(3).tV = 0.242
        Case "&"
            Bznak = True
            Vert(0).tU = 0.412: Vert(0).tV = 0.125
            Vert(1).tU = 0.472: Vert(1).tV = 0.125
            Vert(2).tU = 0.412: Vert(2).tV = 0.242
            Vert(3).tU = 0.472:  Vert(3).tV = 0.242
        Case "*"
            Bznak = True
            Vert(0).tU = 0.469: Vert(0).tV = 0.125
            Vert(1).tU = 0.53: Vert(1).tV = 0.125
            Vert(2).tU = 0.469: Vert(2).tV = 0.242
            Vert(3).tU = 0.53:  Vert(3).tV = 0.242
        Case "("
            Bznak = True
            Vert(0).tU = 0.529: Vert(0).tV = 0.125
            Vert(1).tU = 0.589: Vert(1).tV = 0.125
            Vert(2).tU = 0.529: Vert(2).tV = 0.242
            Vert(3).tU = 0.589:  Vert(3).tV = 0.242
        Case ")"
            Bznak = True
            Vert(0).tU = 0.587: Vert(0).tV = 0.125
            Vert(1).tU = 0.647: Vert(1).tV = 0.125
            Vert(2).tU = 0.587: Vert(2).tV = 0.242
            Vert(3).tU = 0.647:  Vert(3).tV = 0.242
        Case "_"
            Bznak = True
            Vert(0).tU = 0.646: Vert(0).tV = 0.125
            Vert(1).tU = 0.706: Vert(1).tV = 0.125
            Vert(2).tU = 0.646: Vert(2).tV = 0.242
            Vert(3).tU = 0.706:  Vert(3).tV = 0.242
        Case "+"
            Bznak = True
            Vert(0).tU = 0.704: Vert(0).tV = 0.125
            Vert(1).tU = 0.764: Vert(1).tV = 0.125
            Vert(2).tU = 0.704: Vert(2).tV = 0.242
            Vert(3).tU = 0.764:  Vert(3).tV = 0.242
        Case "/"
            Bznak = True
            Vert(0).tU = 0.762: Vert(0).tV = 0.125
            Vert(1).tU = 0.822: Vert(1).tV = 0.125
            Vert(2).tU = 0.762: Vert(2).tV = 0.242
            Vert(3).tU = 0.822:  Vert(3).tV = 0.242
        Case "-"
            Bznak = True
            Vert(0).tU = 0.822: Vert(0).tV = 0.125
            Vert(1).tU = 0.882: Vert(1).tV = 0.125
            Vert(2).tU = 0.822: Vert(2).tV = 0.242
            Vert(3).tU = 0.882:  Vert(3).tV = 0.242
        Case "="
            Bznak = True
            Vert(0).tU = 0.88: Vert(0).tV = 0.125
            Vert(1).tU = 0.94: Vert(1).tV = 0.125
            Vert(2).tU = 0.88: Vert(2).tV = 0.242
            Vert(3).tU = 0.94:  Vert(3).tV = 0.242
        Case "`"
            Bznak = True
            Vert(0).tU = 0.94: Vert(0).tV = 0.125
            Vert(1).tU = 1: Vert(1).tV = 0.125
            Vert(2).tU = 0.94: Vert(2).tV = 0.242
            Vert(3).tU = 1:  Vert(3).tV = 0.242
     '///////
        Case "¹"
            Bznak = True
            Vert(0).tU = 0: Vert(0).tV = 0.242
            Vert(1).tU = 0.062: Vert(1).tV = 0.242
            Vert(2).tU = 0: Vert(2).tV = 0.365
            Vert(3).tU = 0.062:  Vert(3).tV = 0.365
        Case "?"
            Bznak = True
            Vert(0).tU = 0.06: Vert(0).tV = 0.242
            Vert(1).tU = 0.12: Vert(1).tV = 0.242
            Vert(2).tU = 0.06: Vert(2).tV = 0.365
            Vert(3).tU = 0.12:  Vert(3).tV = 0.365
        Case "["
            Bznak = True
            Vert(0).tU = 0.118: Vert(0).tV = 0.242
            Vert(1).tU = 0.18: Vert(1).tV = 0.242
            Vert(2).tU = 0.118: Vert(2).tV = 0.365
            Vert(3).tU = 0.18:  Vert(3).tV = 0.365
        Case "]"
            Bznak = True
            Vert(0).tU = 0.177: Vert(0).tV = 0.242
            Vert(1).tU = 0.237: Vert(1).tV = 0.242
            Vert(2).tU = 0.177: Vert(2).tV = 0.365
            Vert(3).tU = 0.237:  Vert(3).tV = 0.365
        Case "{"
            Bznak = True
            Vert(0).tU = 0.236: Vert(0).tV = 0.242
            Vert(1).tU = 0.296: Vert(1).tV = 0.242
            Vert(2).tU = 0.236: Vert(2).tV = 0.365
            Vert(3).tU = 0.296:  Vert(3).tV = 0.365
        Case "}"
            Bznak = True
            Vert(0).tU = 0.294: Vert(0).tV = 0.242
            Vert(1).tU = 0.354: Vert(1).tV = 0.242
            Vert(2).tU = 0.294: Vert(2).tV = 0.365
            Vert(3).tU = 0.354:  Vert(3).tV = 0.365
        Case ";"
            Bznak = True
            Vert(0).tU = 0.352: Vert(0).tV = 0.242
            Vert(1).tU = 0.412: Vert(1).tV = 0.242
            Vert(2).tU = 0.352: Vert(2).tV = 0.365
            Vert(3).tU = 0.412:  Vert(3).tV = 0.365
        Case ":"
            Bznak = True
            Vert(0).tU = 0.412: Vert(0).tV = 0.242
            Vert(1).tU = 0.472: Vert(1).tV = 0.242
            Vert(2).tU = 0.412: Vert(2).tV = 0.365
            Vert(3).tU = 0.472:  Vert(3).tV = 0.365
        Case """"
            Bznak = True
            Vert(0).tU = 0.469: Vert(0).tV = 0.242
            Vert(1).tU = 0.53: Vert(1).tV = 0.242
            Vert(2).tU = 0.469: Vert(2).tV = 0.365
            Vert(3).tU = 0.53:  Vert(3).tV = 0.365
        Case "`"""
            Bznak = True
            Vert(0).tU = 0.529: Vert(0).tV = 0.242
            Vert(1).tU = 0.589: Vert(1).tV = 0.242
            Vert(2).tU = 0.529: Vert(2).tV = 0.365
            Vert(3).tU = 0.589:  Vert(3).tV = 0.365
        Case "`"
            Bznak = True
            Vert(0).tU = 0.587: Vert(0).tV = 0.242
            Vert(1).tU = 0.647: Vert(1).tV = 0.242
            Vert(2).tU = 0.587: Vert(2).tV = 0.365
            Vert(3).tU = 0.647:  Vert(3).tV = 0.365
        Case ","
            Bznak = True
            Vert(0).tU = 0.646: Vert(0).tV = 0.242
            Vert(1).tU = 0.706: Vert(1).tV = 0.242
            Vert(2).tU = 0.646: Vert(2).tV = 0.365
            Vert(3).tU = 0.706:  Vert(3).tV = 0.365
        Case "."
            Bznak = True
            Vert(0).tU = 0.704: Vert(0).tV = 0.242
            Vert(1).tU = 0.764: Vert(1).tV = 0.242
            Vert(2).tU = 0.704: Vert(2).tV = 0.365
            Vert(3).tU = 0.764:  Vert(3).tV = 0.365
        Case "\"
            Bznak = True
            Vert(0).tU = 0.762: Vert(0).tV = 0.242
            Vert(1).tU = 0.822: Vert(1).tV = 0.242
            Vert(2).tU = 0.762: Vert(2).tV = 0.365
            Vert(3).tU = 0.822:  Vert(3).tV = 0.365
        Case "<"
            Bznak = True
            Vert(0).tU = 0.822: Vert(0).tV = 0.242
            Vert(1).tU = 0.882: Vert(1).tV = 0.242
            Vert(2).tU = 0.822: Vert(2).tV = 0.365
            Vert(3).tU = 0.882:  Vert(3).tV = 0.365
        Case ">"
            Bznak = True
            Vert(0).tU = 0.88: Vert(0).tV = 0.242
            Vert(1).tU = 0.94: Vert(1).tV = 0.242
            Vert(2).tU = 0.88: Vert(2).tV = 0.365
            Vert(3).tU = 0.94:  Vert(3).tV = 0.365
        Case ""
            Bznak = True
            Vert(0).tU = 0.94: Vert(0).tV = 0.242
            Vert(1).tU = 1: Vert(1).tV = 0.242
            Vert(2).tU = 0.94: Vert(2).tV = 0.365
            Vert(3).tU = 1:  Vert(3).tV = 0.365
       
        'Case Is > 8 And Number < 11
    End Select
End Sub

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

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

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

Сообщение PilatP » 24.09.2014 (Ср) 15:19

Mikle писал(а):заменяется одной строкой MatrixRotationYawPitchRoll.

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

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

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

Сообщение Mikle » 24.09.2014 (Ср) 17:56

Ты дал код 2D спрайтов-надписей... он ужасен :(
Самый смак - Select Case znak.
PilatP писал(а):можно ли как его ускорить

В первую очередь - не рисовать знаки по одному, а сначала генерировать геометрию (вертексный и индексный буфер на всю надпись), а потом рисовать одним вызовом DrawIndexedPrimitiveUp
PilatP писал(а):что делает этот код

Эта функция вращает сразу по трём осям.
PilatP писал(а):добавив вывод спрайта после меша, все и за крутилось,

Там у тебя строка:
MatrixTranslation mWorld, mXx, mYy, mZz

Она меняет матрицу mWorld, на эта матрица, видимо, Public, или Private, но на уровне модуля, то есть используется и другими процедурами. Потом в других процедурах используется уже изменённая матрица.
Я вижу, что ты не разбираешься, что делаешь, а пытаешься копипастить фрагменты кода.

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

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

Сообщение PilatP » 24.09.2014 (Ср) 18:15

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

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

Mikle писал(а):Ты дал код 2D спрайтов-надписей... он ужасен

Я знаю что код ужасен, и прекрасно понимаю что
Код: Выделить всё
Select Case znak.
это смерть фпс, вот по этому и выложил код, в надежде что, у других есть лучше идеи, как либо оптимизировать, либо предложить вариант :cry:

Mikle писал(а):В первую очередь - не рисовать знаки по одному, а сначала генерировать геометрию (вертексный и индексный буфер на всю надпись), а потом рисовать одним вызовом DrawIndexedPrimitiveUp

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

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

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

Сообщение PilatP » 24.09.2014 (Ср) 19:37

Mikle писал(а):Она меняет матрицу mWorld, на эта матрица, видимо, Public, или Private, но на уровне модуля, то есть используется и другими процедурами.

Обьявление матрицыdim и на уровне функции, правда она же обьявляется и в функции спрайта, это может влиять?
На сколько я знал, если переменная обьявлена в функции, то работает только в ней, если в модуле, то только в модуле, если Public то везде, или я ошибаюсь.
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 25.09.2014 (Чт) 15:32

PilatP писал(а):Обьявление матрицыdim и на уровне функции, правда она же обьявляется и в функции спрайта, это может влиять?

Нет.
PilatP писал(а):если переменная обьявлена в функции, то работает только в ней, если в модуле, то только в модуле, если Public то везде

Да. Только с учётом того, что, если переменная объявлена и в функции, и Public, то внутри функции используется её внутренняя переменная.

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

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

Сообщение PilatP » 25.09.2014 (Чт) 16:52

Mikle писал(а):Да. Только с учётом того, что, если переменная объявлена и в функции, и Public, то внутри функции используется её внутренняя переменная.

То есть у меня есть Public mView As D3DMATRIX, обьявленая в классе, и если я еще раз их вот так обьявлю

Код: Выделить всё
Public Sub Draw()
dim  mView As D3DMATRIX, mProj As D3DMATRIX

то результат mView не выйдет из Public Sub Draw() и Public mView As D3DMATRIX не изменится
Я не волшебник, я только учусь)

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

Сообщение Qwertiy » 25.09.2014 (Чт) 17:07

Да. Ну если ты не передашь матрицу из процедуры куда-то во вне, откуда будет доступ к обеим.

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

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

Сообщение Mikle » 25.09.2014 (Чт) 17:14

PilatP писал(а):результат mView не выйдет из Public Sub Draw() и Public mView As D3DMATRIX не изменится

Да. Есть правило - стараться никогда не делать Public то, что можно сделать Private.
Вообще - не очень хорошая идея, работать местами с шейдерами, а местами с FFP. Я попозже напишу тебе пару простых шейдеров для 2D и 3D спрайтов, чтобы вообще от FFP избавиться, код чище будет.
Qwertiy писал(а):Ну если ты не передашь матрицу из процедуры куда-то во вне, откуда будет доступ к обеим.

А как передашь? Параметром через ссылку? Тогда имя матрицы уже будет не mView, а то, какое у параметра.

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

Сообщение Qwertiy » 25.09.2014 (Чт) 17:18

Mikle писал(а):А как передашь? Параметром через ссылку? Тогда имя матрицы уже будет не mView, а то, какое у параметра.

Я имел в виду, что можно передать матрицу из процедуры в другую процедуру (да, под другим именем), которой доступна и public-матрица. Тогда эта процедура сможет переприсвоить или модифицировать public-матрицу в соответствии с этой. Я просто отвечал на вопрос о возможности изменения public-матрицы при существовании локальной с тем же именем.

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

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

Сообщение Mikle » 25.09.2014 (Чт) 17:27

Qwertiy писал(а):Тогда эта процедура сможет переприсвоить или модифицировать public-матрицу в соответствии с этой.

Она сможет её модифицировать и НЕ в соответствие с этой, может даже без передачи туда этой матрицы. В любом случае Public матрица будет изменена в другой процедуре.

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

Сообщение Qwertiy » 25.09.2014 (Чт) 17:31

Mikle писал(а):В любом случае Public матрица будет изменена в другой процедуре.

Ну да. Только вот о чём мы спорим? Не вижу никаких противоречий.

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

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

Сообщение PilatP » 25.09.2014 (Чт) 21:05

Mikle писал(а):Вообще - не очень хорошая идея, работать местами с шейдерами, а местами с FFP. Я попозже напишу тебе пару простых шейдеров для 2D и 3D спрайтов, чтобы вообще от FFP избавиться, код чище будет.

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

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

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

Сообщение Mikle » 27.09.2014 (Сб) 10:38

Для 2D спрайтов:
Добавь модуль с таким кодом:

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

Private Type vFormat
  Pos As D3DVECTOR2
  tu0 As Single
  tv0 As Single
End Type

Dim vBuf(3) As vFormat
Dim PS As Direct3DPixelShader9
Dim VS As Direct3DVertexShader9
Dim vDecl As Direct3DVertexDeclaration
Dim kw As Single, kh As Single

Dim vSize As Long

Public Sub SpriteDraw(Tex As Direct3DTexture9, ByVal Left As Single, ByVal Top As Single, ByVal Width As Single, ByVal Height As Single)
  vBuf(0).Pos.x = -1 + Left * kw
  vBuf(0).Pos.y = 1 - (Top + Height) * kh
  vBuf(1).Pos.x = vBuf(0).Pos.x
  vBuf(1).Pos.y = 1 - Top * kh
  vBuf(2).Pos.x = -1 + (Left + Width) * kw
  vBuf(2).Pos.y = vBuf(0).Pos.y
  vBuf(3).Pos.x = vBuf(2).Pos.x
  vBuf(3).Pos.y = vBuf(1).Pos.y

  Dev.SetTexture 0, Tex
  Dev.SetVertexDeclaration vDecl
  Dev.SetVertexShader VS
  Dev.SetPixelShader PS
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(vBuf(0)), vSize
End Sub

Public Sub SpriteInit()
  kw = 1 / ScrCenterX
  kh = 1 / ScrCenterY
  VS_Create
  PS_Create
  vSize = Len(vBuf(0))
  vBuf(0).tu0 = 0
  vBuf(0).tv0 = 1
  vBuf(1).tu0 = 0
  vBuf(1).tv0 = 0
  vBuf(2).tu0 = 1
  vBuf(2).tv0 = 1
  vBuf(3).tu0 = 1
  vBuf(3).tv0 = 0
End Sub

Private Sub VS_Create()
  Dim vsDecl(3) As D3DVERTEXELEMENT9

  vsDecl(0) = VertexElement(0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0)
  vsDecl(1) = VertexElement(0, 8, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0)
  vsDecl(2) = VertexElementEnd

  Set vDecl = Dev.CreateVertexDeclaration(VarPtr(vsDecl(0)))
  Set VS = Dev.CreateVertexShaderFromFile(App.Path & "\ShaderCompiler\Out\Sprite.vsh.shader")
End Sub

Private Sub PS_Create()
  Set PS = Dev.CreatePixelShaderFromFile(App.Path & "\ShaderCompiler\Out\Sprite.psh.shader")
End Sub

Public Sub SpriteTerminate()
  Set PS = Nothing
  Set VS = Nothing
  Set vDecl = Nothing
End Sub

Сделай ScrCenterX и ScrCenterY Public.
Добавь в StartUp ПОСЛЕ CtrlInit инициализацию спрайта - SpriteInit.
В ClearAll, само собой, добавь SpriteTerminate.
Так же в StartUp добавь настройки альфаналожения:
Код: Выделить всё
  Dev.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
  Dev.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA

Вертексный шейдер Sprite.vsh:
Код: Выделить всё
vs_2_0

dcl_position v0
dcl_texcoord0 v1

mov oPos, v0
mov oT0, v1

Пиксельный шейдер Sprite.psh:
Код: Выделить всё
ps_2_0

dcl t0
dcl_2d s0

texld r0, t0, s0
mov oC0, r0

Теперь с помощь SpriteDraw можно выводить спрайт указанной текстурой на указанные координаты, если спрайт использует прозрачность - перед выводом нужно разрешать альфаналожение:
Код: Выделить всё
  Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_TRUE

А после вывода - запрещать:
Код: Выделить всё
  Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_FALSE

Если текстура спрайта должна быть создаваемой на ходу (какой-нибудь текст) - ещё раз рекомендую метод создания из AoS2.

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

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

Сообщение PilatP » 28.09.2014 (Вс) 16:12

Спасибо огромное Mikle, все просто, и здорово работает.
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 28.09.2014 (Вс) 16:15

Mikle писал(а):Если текстура спрайта должна быть создаваемой на ходу (какой-нибудь текст) - ещё раз рекомендую метод создания из AoS2.

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

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

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

Сообщение Mikle » 28.09.2014 (Вс) 17:34

PilatP писал(а):как это реализовано, на сколько я понял, ты передаеш содержимое в текстуру, а что если нужно писать длинные надписи?

На форма - PictureBox с AutoRedraw = True, Visible = False. Размер - по размеру надписи, такого же размера и текстура. В текстуре один мипуровень (параметр Levels = 1).
Из текстуры берётся сурфейс с индексом 0.
Печатаем в PictureBox с помощью Print нужный текст.
Считываем данные картинки в массив с помощью GetDIBits.
Отправляем в сурфейс с помощью SetData.
Всё, в этой текстуре уже нужная надпись.

Кстати, что ты имеешь ввиду под словами "3D спрайт"? Может тебе билборд нужен?

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

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

Сообщение PilatP » 28.09.2014 (Вс) 20:13

Mikle писал(а):Печатаем в PictureBox с помощью Print нужный текст.

честно говоря меня, смущает Print, GetDIBits, SetData по быстродействию. Например, если нужно будет выводить много текста, более 100-200 символов, или много раз короткие, например более 20 строк(список).

Mikle писал(а):Кстати, что ты имеешь ввиду под словами "3D спрайт"? Может тебе билборд нужен?

Билборд очень нужен, и 3D спрайт например нужно будет отображать текстуру(солнце), по координатам
Я не волшебник, я только учусь)

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

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

Сообщение PilatP » 29.09.2014 (Пн) 13:08

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

  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 ' эта загадка
  MatrixTranspose Mtrx, Mtrx '?

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

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

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

Сообщение Mikle » 29.09.2014 (Пн) 13:24

Код: Выделить всё
  MatrixMultiply Mtrx, Mtrx, mView 'а эти на сколько я понял отрисовали на общей матрице
  MatrixMultiply Mtrx, Mtrx, mProj ' эта загадка

Это домножили мировую матрицу на матрицы обзора и проекции, чтобы, грубо говоря, получить матрицу преобразования из 3D мира на 2D экран.
Код: Выделить всё
  MatrixTranspose Mtrx, Mtrx '?

Транспонировали (поменяли местами строки и столбцы) так как в шейдерах используется порядок не тот, что в FFP.

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

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

Сообщение PilatP » 29.09.2014 (Пн) 17:24

Mikle писал(а):
Код: Выделить всё
  MatrixTranspose Mtrx, Mtrx '?

Транспонировали (поменяли местами строки и столбцы) так как в шейдерах используется порядок не тот, что в FFP.

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

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

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

Сообщение Mikle » 30.09.2014 (Вт) 9:03

PilatP писал(а):честно говоря мало понятно, что делает этот код

Транспозиция матрицы - это просто смена местами столбцов и строк. Просто в шейдер матрицу удобно передавать именно в таком виде, матрица туда передаётся четырьмя 4D векторами, так вот нам нужно, чтобы эти вектора содержали не строки, а столбцы.
PilatP писал(а):ты говорил о билборде

3D спрайт - это просто модель из двух треугольников, единственное, что его отличает от обычного меша - это возможная необходимость того, чтобы он был виден сзади. Это решается сменой CullMode на CullNone.
А билборд - это 3D спрайт с определённым образом рассчитанной трансформацией. Сделаю.

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

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

Сообщение PilatP » 30.09.2014 (Вт) 10:15

Mikle писал(а):3D спрайт - это просто модель из двух треугольников, единственное, что его отличает от обычного меша - это возможная необходимость того, чтобы он был виден сзади. Это решается сменой CullMode на CullNone.

Да это я знаю, вопрос в том как можно его крутить, сколько пробовал через матрицы не получается :oops:
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 30.09.2014 (Вт) 14:27

PilatP писал(а):как можно его крутить, сколько пробовал через матрицы не получается

Точно так же, как крутится в демке автомат.
Вот модуль для 3D спрайта, назвал его Face:
Код: Выделить всё
Option Explicit

Private Type vFormat
  Pos As D3DVECTOR
  tu0 As Single
  tv0 As Single
End Type

Dim vBuf(3) As vFormat
Dim PS As Direct3DPixelShader9
Dim VS As Direct3DVertexShader9
Dim vDecl As Direct3DVertexDeclaration

Dim vSize As Long

Public Sub FaceDraw(Tex As Direct3DTexture9, Mtrx As D3DMATRIX)
  Dim c As D3DCULL

  Dev.GetRenderState D3DRS_CULLMODE, c
  Dev.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE

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

  Dev.SetTexture 0, Tex
  Dev.SetVertexDeclaration vDecl
  Dev.SetVertexShader VS
  Dev.SetPixelShader PS
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(vBuf(0)), vSize

  Dev.SetRenderState D3DRS_CULLMODE, c
End Sub

Public Sub FaceInit()
  VS_Create
  PS_Create
  vSize = Len(vBuf(0))

  vBuf(0).Pos.x = -0.5
  vBuf(0).Pos.y = -0.5
  vBuf(0).Pos.z = 0
  vBuf(1).Pos.x = -0.5
  vBuf(1).Pos.y = 0.5
  vBuf(1).Pos.z = 0
  vBuf(2).Pos.x = 0.5
  vBuf(2).Pos.y = -0.5
  vBuf(2).Pos.z = 0
  vBuf(3).Pos.x = 0.5
  vBuf(3).Pos.y = 0.5
  vBuf(3).Pos.z = 0

  vBuf(0).tu0 = 0
  vBuf(0).tv0 = 1
  vBuf(1).tu0 = 0
  vBuf(1).tv0 = 0
  vBuf(2).tu0 = 1
  vBuf(2).tv0 = 1
  vBuf(3).tu0 = 1
  vBuf(3).tv0 = 0
End Sub

Private Sub VS_Create()
  Dim vsDecl(2) As D3DVERTEXELEMENT9

  vsDecl(0) = VertexElement(0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0)
  vsDecl(1) = VertexElement(0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0)
  vsDecl(2) = VertexElementEnd

  Set vDecl = Dev.CreateVertexDeclaration(VarPtr(vsDecl(0)))
  Set VS = Dev.CreateVertexShaderFromFile(App.Path & "\ShaderCompiler\Out\Face.vsh.shader")
End Sub

Private Sub PS_Create()
  Set PS = Dev.CreatePixelShaderFromFile(App.Path & "\ShaderCompiler\Out\Face.psh.shader")
End Sub

Public Sub FaceTerminate()
  Set PS = Nothing
  Set VS = Nothing
  Set vDecl = Nothing
End Sub

Шейдеры:
Код: Выделить всё
vs_2_0

// c0..c3 - matrix WorldVievProj

dcl_position v0
dcl_texcoord0 v1

m4x4 oPos, v0, c0

mov oT0.xy, v1


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

dcl t0
dcl_2d s0

texld r0, t0, s0
mov oC0, r0


Это ты уже мог и сам сделать. Вот расчёт билборда чуть сложнее, позже дам, отвлекли.

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

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

Сообщение PilatP » 30.09.2014 (Вт) 14:31

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

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

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

Сообщение PilatP » 30.09.2014 (Вт) 15:11

Разобрался по чему не работало, дело было в вертексном шейдере, я подставил от спрайта, наивно пологая что подойдет, декларацию я изменил, а в шейдер не глянул, а все остальное такое же :D. Все работает, сделал изменение размера, и вращение :D

вот код может кому нужен будет, я объединил все в одном классе для удобства
Код: Выделить всё
Option Explicit
Private Type vFormat
  Pos As D3DVECTOR2
  tu0 As Single
  tv0 As Single
End Type

Private Type vFormat2
  Pos As D3DVECTOR
  tu0 As Single
  tv0 As Single
End Type

Dim vBuf(3) As vFormat
Dim vBufs(3) As vFormat2
Dim PS As Integer, PS3 As Integer
Dim VS As Integer, VS3 As Integer
Dim vDecl As Direct3DVertexDeclaration, vDecl1 As Direct3DVertexDeclaration
Dim kw As Single, kh As Single

Dim vSize As Long, vSize1 As Long

Public Sub SpriteDraw(TeksturID As Integer, ByVal Left As Single, ByVal Top As Single, ByVal Width As Single, ByVal Height As Single)
  Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_TRUE
  vBuf(0).Pos.x = -1 + Left * kw
  vBuf(0).Pos.y = 1 - (Top + Height) * kh
  vBuf(1).Pos.x = vBuf(0).Pos.x
  vBuf(1).Pos.y = 1 - Top * kh
  vBuf(2).Pos.x = -1 + (Left + Width) * kw
  vBuf(2).Pos.y = vBuf(0).Pos.y
  vBuf(3).Pos.x = vBuf(2).Pos.x
  vBuf(3).Pos.y = vBuf(1).Pos.y

  Dev.SetTexture 0, Tekstura(TeksturID).Textures
  Dev.SetVertexDeclaration vDecl
  Dev.SetVertexShader Shader(VS).VS
  Dev.SetPixelShader Shader(PS).PS
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(vBuf(0)), vSize
  Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_FALSE
End Sub

Public Sub SpriteInit()
  kw = 1 / ScrCenterX
  kh = 1 / ScrCenterY
  VS_Create
  PS_Create
  vSize = Len(vBuf(0))
  vBuf(0).tu0 = 0
  vBuf(0).tv0 = 1
  vBuf(1).tu0 = 0
  vBuf(1).tv0 = 0
  vBuf(2).tu0 = 1
  vBuf(2).tv0 = 1
  vBuf(3).tu0 = 1
  vBuf(3).tv0 = 0
 
  vSize1 = Len(vBufs(0))
  vBufs(0).Pos.x = -0.5
  vBufs(0).Pos.y = -0.5
  vBufs(0).Pos.z = 0
  vBufs(1).Pos.x = -0.5
  vBufs(1).Pos.y = 0.5
  vBufs(1).Pos.z = 0
  vBufs(2).Pos.x = 0.5
  vBufs(2).Pos.y = -0.5
  vBufs(2).Pos.z = 0
  vBufs(3).Pos.x = 0.5
  vBufs(3).Pos.y = 0.5
  vBufs(3).Pos.z = 0

  vBufs(0).tu0 = 0
  vBufs(0).tv0 = 1
  vBufs(1).tu0 = 0
  vBufs(1).tv0 = 0
  vBufs(2).tu0 = 1
  vBufs(2).tv0 = 1
  vBufs(3).tu0 = 1
  vBufs(3).tv0 = 0
End Sub

Private Sub VS_Create()
  Dim vsDecl(3) As D3DVERTEXELEMENT9

  vsDecl(0) = VertexElement(0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0)
  vsDecl(1) = VertexElement(0, 8, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0)
  vsDecl(2) = VertexElementEnd

  Set vDecl = Dev.CreateVertexDeclaration(VarPtr(vsDecl(0)))
  VS = Find_Shader_Name("Sprite.vsh.shader")
 
  vsDecl(0) = VertexElement(0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0)
  vsDecl(1) = VertexElement(0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0)
  vsDecl(2) = VertexElementEnd

  Set vDecl1 = Dev.CreateVertexDeclaration(VarPtr(vsDecl(0)))
    VS3 = Find_Shader_Name("Sprite3D.vsh.shader")
 
End Sub

Private Sub PS_Create()
  PS = Find_Shader_Name("Sprite.psh.shader")
  PS3 = Find_Shader_Name("Sprite3D.psh.shader")
End Sub

Public Sub SpriteTerminate()
  Set vDecl = Nothing
End Sub

Friend Sub Draw3D(TeksturID As Integer, Pos As D3DVECTOR, Rot As D3DVECTOR, Scal As D3DVECTOR, Optional tuTex As Single = 1, Optional tvTex As Single = 1)
   
  Dim Mts1 As D3DMATRIX, Mts2 As D3DMATRIX
  Dim Mtrx As D3DMATRIX
  Dim c As D3DCULL


  MatrixTranslation Mts1, Pos.x, Pos.y, Pos.z
  MatrixRotationYawPitchRoll Mts2, Rot.y, Rot.x, Rot.z
  MatrixMultiply Mts1, Mts2, Mts1

  MatrixScaling Mts2, Scal.x, Scal.y, Scal.z
  MatrixMultiply Mts1, Mts2, Mts1

  MatrixMultiply Mtrx, Mts1, mView
  MatrixMultiply Mtrx, Mtrx, mProj
  MatrixTranspose Mtrx, Mtrx
  Dev.SetVertexShaderConstantF 0, VarPtr(Mtrx), 4
 
  Dev.GetRenderState D3DRS_CULLMODE, c
  Dev.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
  Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_TRUE
 

  Dev.SetTexture 0, Tekstura(TeksturID).Textures
  Dev.SetVertexDeclaration vDecl1
  Dev.SetVertexShader Shader(VS3).VS
  Dev.SetPixelShader Shader(PS3).PS
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(vBufs(0)), vSize1
   
    Dev.SetRenderState D3DRS_ALPHABLENDENABLE, D3D_FALSE
   Dev.SetRenderState D3DRS_CULLMODE, c
End Sub

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

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

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

Сообщение Mikle » 01.10.2014 (Ср) 9:25

Добавляем в модуль Face такую процедуру:
Код: Выделить всё
Public Sub BillboardDraw(Tex As Direct3DTexture9, Pos As D3DVECTOR, ByVal SizeX As Single, ByVal SizeY As Single)
  Dim Mtrx As D3DMATRIX
  Dim M As D3DMATRIX

  'MatrixLookAtRH Mtrx, Pos, CamPos, Vec3(0, 1, 0)
  MatrixLookAtRH Mtrx, Pos, Vec3(CamPos.x, Pos.y, CamPos.z), Vec3(0, 1, 0)
  MatrixInverse Mtrx, 0, Mtrx
  MatrixScaling M, SizeX, SizeY, 1
  MatrixMultiply Mtrx, M, Mtrx
  MatrixMultiply Mtrx, Mtrx, mView
  MatrixMultiply Mtrx, Mtrx, mProj
  MatrixTranspose Mtrx, Mtrx
  Dev.SetVertexShaderConstantF 0, VarPtr(Mtrx), 4

  Dev.SetTexture 0, Tex
  Dev.SetVertexDeclaration vDecl
  Dev.SetVertexShader VS
  Dev.SetPixelShader PS
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(vBuf(0)), vSize
End Sub

Получаем биллборд. Два варианта, в первом биллборд "наклоняется" к камере, во втором всегда "смотрит" горизонтально. Обычно применяется второй вариант.
Кстати, процедура FaceDraw получилась "опасной", так как неявно портит переданную параметром матрицу, лучше её переделать так:
Код: Выделить всё
Public Sub FaceDraw(Tex As Direct3DTexture9, Mtrx As D3DMATRIX)
  Dim c As D3DCULL
  Dim M As D3DMATRIX

  Dev.GetRenderState D3DRS_CULLMODE, c
  Dev.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE

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

  Dev.SetTexture 0, Tex
  Dev.SetVertexDeclaration vDecl
  Dev.SetVertexShader VS
  Dev.SetPixelShader PS
  Dev.DrawPrimitiveUp D3DPT_TRIANGLESTRIP, 2, VarPtr(vBuf(0)), vSize

  Dev.SetRenderState D3DRS_CULLMODE, c
End Sub

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

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

Сообщение PilatP » 01.10.2014 (Ср) 10:20

Mikle, спасибо, за билборд, теперь смогу сделать блики солнца :D . Mikle, а как сделать вывод надписей над объектом (например как в танках, они ведь не 3д рисуются а 2д).

я как чествовал, и поменял названия матриц, раньше :D :D :D , спасибо что предупредил, а то я думал бы что напрасно
Я не волшебник, я только учусь)

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

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

Сообщение Mikle » 01.10.2014 (Ср) 10:41

PilatP писал(а):а как сделать вывод надписей над объектом

Так это биллборд первого типа с координатами по Y на dY больше,чем у объекта. Либо 2D спрайт, тоже берутся координаты Y + dY и пересчитываются в 2D так, как я уже давал в примере.
PilatP писал(а):я как чествовал, и поменял названия матриц

Название тут не причём, проблема была в том, что матрица, передаваемая ByRef, внутри процедуры менялась, мы могли передать какую-нибудь нужную матрицу, и она будет испорчена.

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

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

Сообщение PilatP » 01.10.2014 (Ср) 14:21

Mikle писал(а):проблема была в том, что матрица, передаваемая ByRef, внутри процедуры менялась, мы могли передать какую-нибудь нужную матрицу, и она будет испорчена.

по этому я и передавал координаты, а не матрицу. Как по мне удобней просто передавать координаты.
Mikle писал(а):Либо 2D спрайт, тоже берутся координаты Y + dY и пересчитываются в 2D так, как я уже давал в примере.

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

Пред.След.

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

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

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

    TopList