Непрограммируемый конвеер

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

Модератор: Mikle

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Непрограммируемый конвеер

Сообщение d3drm » 15.04.2005 (Пт) 0:10

Знаю способ для смешения текстур на полигоне, но он шейдерный.

Его смысл заключается в том, что для каждого вертекса есть 2 текстуры и 2 цветовых составляющих. В зависимости от первого цвета первая текстура изменяет альфа-компонент, то же для второй составляющей. То есть если на полигоне в одном углу первый цвет - черный, второй - белый, а в другом - наоборот, то текстуры смешиваются и получается плавный переход.

можно ли используя непрограммируемый конвеер устроить что-либо подобное?
ХЎ

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

Сообщение Mikle » 15.04.2005 (Пт) 9:27

Две текстуры, один Diffuse. В Diffuse используешь альфа-канал. Первую текстуру накладываешь просто SelectArg1. Для второй
D3DTSS_ALPHAARG1 - Diffuse, блендишь текстуру по диффузной альфе.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 17.04.2005 (Вс) 13:35

Mikle, можешь рендерстейты написать?
ХЎ

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

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

Вот, только добавь текстуры "0.jpg" и "1.jpg":
Код: Выделить всё
Option Explicit

Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dx As New D3DX8
Dim d3dDevice As Direct3DDevice8
Dim vBuffer As Direct3DVertexBuffer8
Dim Tex0 As Direct3DTexture8
Dim Tex1 As Direct3DTexture8
Dim Running As Boolean
Dim Mtrx As D3DMATRIX

Private Type vFormat
  Position As D3DVECTOR
  Color As Long
  tu1 As Single
  tv1 As Single
  tu2 As Single
  tv2 As Single
End Type

Dim v As vFormat, SizeOfVertex As Long
Private Const vFlag = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_TEX2)

Private Sub Form_Load()
  Me.Show
  InitD3D
  InitGeometry
  SetupMatrices
  Running = True
  Do While Running
    DoEvents
    Render
  Loop
  Unload Me
End Sub

Private Sub InitD3D()
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS

  Set d3d = dx.Direct3DCreate
  d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode
 
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
  d3dpp.Windowed = True
  d3dpp.BackBufferFormat = DispMode.Format
  d3dpp.BackBufferCount = 1
  d3dpp.EnableAutoDepthStencil = True
  d3dpp.AutoDepthStencilFormat = D3DFMT_D16
 
  Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)

  d3dDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
  d3dDevice.SetRenderState D3DRS_ZENABLE, D3DZB_FALSE
  d3dDevice.SetRenderState D3DRS_LIGHTING, False

  d3dDevice.SetTextureStageState 0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR
  d3dDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
  d3dDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR

  d3dDevice.SetTextureStageState 1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR
  d3dDevice.SetTextureStageState 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
  d3dDevice.SetTextureStageState 1, D3DTSS_MINFILTER, D3DTEXF_LINEAR

  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_BLENDDIFFUSEALPHA
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_TEXTURE

  SizeOfVertex = Len(v)
End Sub

Private Sub InitGeometry()
Dim Vertices(3) As vFormat

  Set Tex0 = d3dx.CreateTextureFromFile(d3dDevice, App.Path + "\0.jpg")
  Set Tex1 = d3dx.CreateTextureFromFile(d3dDevice, App.Path + "\1.jpg")
  Set vBuffer = d3dDevice.CreateVertexBuffer(4 * Len(Vertices(0)), 0, vFlag, D3DPOOL_DEFAULT)

  Vertices(0).Position = vec3(-1, -1, 0)
  Vertices(0).Color = &HFF000000
  Vertices(0).tu1 = -2
  Vertices(0).tv1 = -2
  Vertices(0).tu2 = -2
  Vertices(0).tv2 = -2
 
  Vertices(1).Position = vec3(-1, 1, 0)
  Vertices(1).Color = &H0
  Vertices(1).tu1 = -2
  Vertices(1).tv1 = 2
  Vertices(1).tu2 = -2
  Vertices(1).tv2 = 2
 
  Vertices(2).Position = vec3(1, -1, 0)
  Vertices(2).Color = &HFF000000
  Vertices(2).tu1 = 2
  Vertices(2).tv1 = -2
  Vertices(2).tu2 = 2
  Vertices(2).tv2 = -2
 
  Vertices(3).Position = vec3(1, 1, 0)
  Vertices(3).Color = &H0
  Vertices(3).tu1 = 2
  Vertices(3).tv1 = 2
  Vertices(3).tu2 = 2
  Vertices(3).tv2 = 2

  D3DVertexBuffer8SetData vBuffer, 0, Len(Vertices(0)) * 4, 0, Vertices(0)
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
  Running = False
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  Set Tex0 = Nothing
  Set Tex1 = Nothing
  Set vBuffer = Nothing
  Set d3dDevice = Nothing
  Set d3d = Nothing
End Sub

Private Function vec3(x As Single, y As Single, z As Single) As D3DVECTOR
  vec3.x = x
  vec3.y = y
  vec3.z = z
End Function

Private Sub SetupMatrices()
  D3DXMatrixLookAtLH Mtrx, vec3(0, 0, -2), vec3(0, 0, 0), vec3(0, 1, 0)
  d3dDevice.SetTransform D3DTS_VIEW, Mtrx

  D3DXMatrixPerspectiveFovLH Mtrx, 1, 0.75, 0.1, 10
  d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx

  D3DXMatrixIdentity Mtrx
  d3dDevice.SetTransform D3DTS_WORLD, Mtrx
End Sub

Private Sub Render()
  d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
  d3dDevice.BeginScene

  d3dDevice.SetTexture 0, Tex0
  d3dDevice.SetTexture 1, Tex1
  d3dDevice.SetStreamSource 0, vBuffer, SizeOfVertex
  d3dDevice.SetVertexShader vFlag
  d3dDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 2

  d3dDevice.EndScene
  d3dDevice.Present ByVal 0, ByVal 0, Me.hWnd, ByVal 0
End Sub

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.04.2005 (Пн) 13:54

Mikle, абалденно! спасибо! Извини, что заставил тебя потратить на меня время.
ХЎ


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 1

    TopList