Модератор: Mikle
Mikle писал(а):Просто нужно делать индексный буфер в формате D3DFMT_INDEX32.
d3dpp.AutoDepthStencilFormat = D3DFMT_INDEX32
PilatP писал(а):И как это сделать?
еслито у меня выбивает ошибку на инициализации DX8
- Код: Выделить всё
d3dpp.AutoDepthStencilFormat = D3DFMT_INDEX32
PilatP писал(а):d3dpp.AutoDepthStencilFormat = D3DFMT_INDEX32
Кривоус Анатолий писал(а):Тебе нужен формат индексного буфера (3-й параметр CreateIndexBuffer)
Кривоус Анатолий писал(а):Кривоус Анатолий писал(а):
Тебе нужен формат индексного буфера (3-й параметр CreateIndexBuffer)
CreateIndexBuffer
Public Sub LoadMesh(Mesh_path As String, Mesh_name As String)
Dim mBuffer As D3DXBuffer
Dim n As Long
Dim k As Single, strTexName As String
Dim MinX As Single, MaxX As Single
Dim MinY As Single, MaxY As Single
Dim MinZ As Single, MaxZ As Single
Dim Mtrx As D3DMATRIX
Set Mesh.Model = d3dx.LoadMeshFromX(Mesh_path & Mesh_name, D3DXMESH_MANAGED, d3dDevice, Nothing, mBuffer, SSCnt)
Set Mesh.Model = Mesh.Model.CloneMeshFVF(D3DXMESH_MANAGED, vFlag, d3dDevice)
Vert_Kol = Mesh.Model.GetNumVertices - 1&
Polig_Kol = Mesh.Model.GetNumFaces * 3&
MeshVertCount = Mesh.Model.GetNumVertices
ReDim Vert(MeshVertCount - 1)
MeshIndCount = Mesh.Model.GetNumFaces * 3
ReDim Ind(MeshIndCount - 1)
Set vBuf = Mesh.Model.GetVertexBuffer
Set iBuf = Mesh.Model.GetIndexBuffer
SizeOfVertex = Len(Vert(0))
D3DVertexBuffer8GetData vBuf, 0, MeshVertCount * SizeOfVertex, D3DLOCK_DISCARD, Vert(0)
D3DIndexBuffer8GetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DLOCK_DISCARD, Ind(0)
Set Mesh.Model = Mesh.Model.Optimize(D3DXMESHOPT_ATTRSORT, ByVal 0, ByVal 0, ByVal 0, Nothing)
ReDim AT(SSCnt - 1)
ReDim MM(SSCnt - 1)
ReDim Mesh.MeshMaterials(SSCnt)
ReDim Mesh.Tekstyr(SSCnt)
ReDim Mesh.nameTekstyr(SSCnt)
For n = 0 To SSCnt - 1
frmMesh.LstSS.AddItem Str$(n)
d3dx.BufferGetMaterial mBuffer, n, MM(n).MatD3D
MM(n).TextureFilename = d3dx.BufferGetTextureName(mBuffer, n)
strTexName = MM(n).TextureFilename
Mesh.nameTekstyr(n) = strTexName
If strTexName <> "" Then
Set Mesh.Tekstyr(n) = d3dx.CreateTextureFromFile(d3dDevice, Mesh_path & strTexName)
End If
Next n
Mesh.Model.GetAttributeTable AT(0), SSCnt
MinX = 1000000: MaxX = -1000000
MinY = 1000000: MaxY = -1000000
MinZ = 1000000: MaxZ = -1000000
For n = 0 To MeshVertCount - 1
If MinX > Vert(n).Pos.X Then MinX = Vert(n).Pos.X
If MaxX < Vert(n).Pos.X Then MaxX = Vert(n).Pos.X
If MinY > Vert(n).Pos.Y Then MinY = Vert(n).Pos.Y
If MaxY < Vert(n).Pos.Y Then MaxY = Vert(n).Pos.Y
If MinZ > Vert(n).Pos.Z Then MinZ = Vert(n).Pos.Z
If MaxZ < Vert(n).Pos.Z Then MaxZ = Vert(n).Pos.Z
Next n
k = MaxX - MinX
If k < MaxY - MinY Then k = MaxY - MinY
If k < MaxZ - MinZ Then k = MaxZ - MinZ
k = 1 / k
D3DXMatrixScaling Mtrx, k, k, k
d3dDevice.SetTransform D3DTS_WORLD, Mtrx
D3DXMatrixTranslation Mtrx, -0.5 * (MaxX + MinX), -0.5 * (MaxY + MinY), -0.5 * (MaxZ + MinZ)
d3dDevice.MultiplyTransform D3DTS_WORLD, Mtrx
D3DVertexBuffer8SetData vBuf, 0, MeshVertCount * SizeOfVertex, D3DLOCK_DISCARD, Vert(0)
D3DIndexBuffer8SetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DLOCK_DISCARD, Ind(0)
load_mesh = True
End Sub
Mikle писал(а):И плюс к этому замена типа Integer на Long в массиве для индексов. Всё это и в DX8 конверторе, и в DX9 просмотрщике.
D3DIndexBuffer8SetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DFMT_INDEX32, Ind(0)
Subscript out of range
For n = 0 To SSCnt - 1
For i = 0 To AT(n).FaceCount * 3 - 1
cI = Ind(AT(n).FaceStart * 3 + i)
[b]If Used(cI) < 0 Then[/b]
Public Sub Save_Mesh()
Dim II() As Long, VV() As vvFormat, Used() As Long
Dim cV As Long, cI As Long, cInd As Long
Dim i As Long, nf As Long, n As Long, IndCnt As Long
IndCnt = 0
For n = 0 To SSCnt - 1
IndCnt = IndCnt + AT(n).FaceCount * 3
Next n
ReDim II(IndCnt - 1)
ReDim VV(MeshVertCount - 1)
ReDim Used(MeshVertCount - 1)
For i = 0 To MeshVertCount - 1
Used(i) = -1
Next i
cV = 0
cInd = 0
For n = 0 To SSCnt - 1
For i = 0 To AT(n).FaceCount * 3 - 1
cI = Ind(AT(n).FaceStart * 3 + i)
If Used(cI) < 0 Then
VV(cV).Pos = Vert(cI).Pos
VV(cV).Norm = Vert(cI).Norm
VV(cV).tu = Vert(cI).tu
VV(cV).tv = Vert(cI).tv
Used(cI) = cV
II(cInd) = cV
cV = cV + 1
Else
II(cInd) = Used(cI)
End If
cInd = cInd + 1
Next i
Next n
ReDim Preserve VV(cV - 1)
nf = FreeFile
Open App.Path & "\Mesh\Out\" & Name_mesh & ".mesh" For Binary As #nf
Put #nf, , cV
Put #nf, , IndCnt
Put #nf, , VV()
Put #nf, , II()
Close #nf
Dim ts
Dim a
If fso.FileExists(App.Path & "\Mesh\Out\" & Name_mesh & ".imesh") Then
'Set a = fso.CreateTextFile(App.Path & "\Mesh\Out\" & Name_mesh & ".imesh", True)
Set ts = fso.OpenTextFile(App.Path & "\Mesh\Out\" & Name_mesh & ".imesh", ForWriting, True)
ts.WriteLine MeshVertCount & "\/"
ts.WriteLine MeshIndCount & "\/"
ts.WriteLine SSCnt & "\/"
For n = 0 To SSCnt - 1
ts.WriteLine Mesh.nameTekstyr(n) & "\/"
ts.WriteLine AT(n).FaceStart & "\/"
ts.WriteLine AT(n).FaceCount & "\/"
ts.WriteLine AT(n).VertexStart & "\/"
ts.WriteLine AT(n).VertexCount & "\/"
Next n
ts.Close
End If
End Sub
PilatP писал(а):Их я уже заменил.
- Код: Выделить всё
D3DIndexBuffer8SetData iBuf, 0, MeshIndCount * Len(Ind(0)), D3DFMT_INDEX32, Ind(0)
подставил сюда, ошибку уже не выбивает.
Set Mesh.Model = Mesh.Model.CloneMeshFVF(D3DXMESH_MANAGED Or D3DXMESH_32BIT, vFlag, d3dDevice)
Mikle писал(а):Фантастика... как относится формат индекса к параметрам блокировки массива?
PilatP писал(а):может продолжим с ландшафтом
Mikle писал(а):Тебя устраивает вариант на Volume текстуре со всеми его недостатками?
PilatP писал(а):можно ли для промежуточного перехода, выбирать текстуру, для перехода
типа т1 и т8 а промежуточная т4
PilatP писал(а):можно ли на Volume текстуре обойтись без промежуточных текстур?
Mikle писал(а):Предлагаю вариант - делать 5 текстур (плюс 5 нормалмапов) и одна ARGB текстура-маска.
Mikle писал(а): Спекуляр с ландшафта убрать - его на скринах танчиков не видно, он для материалов ландшафта практически не нужен. Спекуляр бывает заметен на гладком асфальте - вот на дорогу его потом и накладывать.
PilatP писал(а):5 текстур это надеюсь не придел? Для старта этого достаточно, но вдруг потребуется больше 5 текстур
И можно по подробней об этом варианте.
MatrixMultiply Mtrx, mWorld, mView
MatrixMultiply Mtrx, Mtrx, mProj
Dim vSpr As D3DVECTOR4
Vec4Transform vSpr, Vec4(0, 0, 0, 1), Mtrx
If vSpr.w > 0 Then
SpriteDraw ScrCenterX * (1 + vSpr.x / vSpr.w), ScrCenterY * (1 - vSpr.y / vSpr.w)
End If
Friend Sub Draw(mXx As Single, mYy As Single, mZz As Single, Ax!, Ay!, aZ!, Optional ScalX! = 1, Optional ScalY! = 1, Optional ScalZ! = 1)
Dim matRot As D3DMATRIX
Dim matScal As D3DMATRIX
Dim matRotX As D3DMATRIX
Dim matRotY As D3DMATRIX
Dim matRotZ As D3DMATRIX
Dim Mtrx As D3DMATRIX
Dim v3 As D3DVECTOR
Dim v4 As D3DVECTOR4
Dim i As Long
MatrixScaling matScal, ScalX, ScalY, ScalZ
MatrixRotationX matRotX, Ax
MatrixRotationY matRotY, Ay
MatrixRotationZ matRotZ, aZ
MatrixMultiply matRot, matRotX, matRotY
MatrixMultiply matRot, matRot, matRotZ
MatrixMultiply matRot, matScal, matRot
MatrixTranslation mWorld, mXx, mYy, mZz
MatrixMultiply mWorld, matRot, mWorld
Dev.SetTransform D3DTS_WORLD, mWorld
MatrixMultiply Mtrx, mWorld, mView
MatrixMultiply Mtrx, Mtrx, mProj
MatrixTranspose Mtrx, Mtrx
MatrixMultiply Mtrx, mWorld, mView
MatrixMultiply Mtrx, Mtrx, mProj
MatrixTranspose Mtrx, Mtrx
Dev.SetTransform D3DTS_WORLD, mWorld
MatrixRotationX matRotX, Ax
MatrixRotationY matRotY, Ay
MatrixRotationZ matRotZ, aZ
MatrixMultiply matRot, matRotX, matRotY
MatrixMultiply matRot, matRot, matRotZ
Friend Sub Draw(mXx As Single, mYy As Single, mZz As Single, Ax!, Ay!, aZ!, Optional ScalX! = 1, Optional ScalY! = 1, Optional ScalZ! = 1)
Dim matRot As D3DMATRIX
Dim matScal As D3DMATRIX
Dim matRotX As D3DMATRIX
Dim matRotY As D3DMATRIX
Dim matRotZ As D3DMATRIX
Dim Mtrx As D3DMATRIX
Dim v3 As D3DVECTOR
Dim v4 As D3DVECTOR4
Dim i As Long
MatrixScaling matScal, ScalX, ScalY, ScalZ
MatrixRotationX matRotX, Ax
MatrixRotationY matRotY, Ay
MatrixRotationZ matRotZ, aZ
MatrixMultiply matRot, matRotX, matRotY
MatrixMultiply matRot, matRot, matRotZ
MatrixMultiply matRot, matScal, matRot
MatrixTranslation mWorld, mXx, mYy, mZz
MatrixMultiply mWorld, matRot, mWorld
Dev.SetTransform D3DTS_WORLD, mWorld
MatrixMultiply Mtrx, mWorld, mView
MatrixMultiply Mtrx, Mtrx, mProj
MatrixTranspose Mtrx, Mtrx
Dev.SetVertexShaderConstantF 0, VarPtr(Mtrx), 4
MatrixInverse Mtrx, 0, mWorld
Vec3TransformNormal v3, DirToLight, Mtrx
v4 = Vec4(v3.X, v3.Y, v3.Z, 0)
Dev.SetVertexShaderConstantF 4, VarPtr(v4), 1
Dev.SetVertexShaderConstantF 5, VarPtr(Diffuse), 1
Dev.SetVertexShaderConstantF 6, VarPtr(Ambient), 1
Dev.SetVertexShaderConstantF 7, VarPtr(Specular), 1
Vec3TransformCoord v3, CamPos, Mtrx
Dev.SetVertexShaderConstantF 8, VarPtr(v3), 1
Dev.SetVertexDeclaration vDecl
Dev.SetVertexShader VS
Dev.SetPixelShader PS
Dev.SetStreamSource 0, vBuf, 0, vSize
Dev.SetIndices iBuf
For i = 0 To SSCnt - 1
Dev.SetTexture 0, Tekstura(Tex(i, 0)).Textures
Dev.SetTexture 1, Tekstura(Tex(i, 1)).Textures
Dev.SetTexture 2, Tekstura(Tex(i, 2)).Textures
Dev.SetTexture 3, Tekstura(Tex(i, 3)).Textures
Dev.DrawIndexedPrimitive D3DPT_TRIANGLELIST, 0, 0, AT(i).FaceStart * 3, 0, AT(i).FaceCount
Next i
'Dev.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW
End Sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29