Смешивание текстур и Diffuse?

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

Модератор: Mikle

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 133
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Смешивание текстур и Diffuse?

Сообщение longwair » 12.11.2020 (Чт) 3:56

Есть два меша типа D3DXMesh, один рисуется с одной текстурой а второй с двумя смешанными.
Смешиваю так:
Код: Выделить всё
    d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
    d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
    'd3dDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_CURRENT

    d3dDevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 0
    d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
    d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
 
    d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_MODULATE
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG1, D3DTA_DIFFUSE

Чтобы отобразить Diffuse на меше с двумя(смешанными) текстурами добавил третью стадию D3DTA_DIFFUSE. Но при этом меш с одной текстурой не отображает Diffuse.
Попробовал добавить в SetTextureStageState 1 отображение Diffuse, он стал виден везде но, перестала рисоваться вторая(смешанная) текстура.
Вопрос таков: Как сделать что бы Diffuse отображался и на меше с одной текстурой и на меше с двумя(смешанными) текстурами?
Прилагаю проект для понятия.
Рендер в коде формы
Вычисления в модуле ModGameMesh\InitGeometry
У вас нет доступа для просмотра вложений в этом сообщении.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Смешивание текстур и Diffuse?

Сообщение Mikle » 12.11.2020 (Чт) 9:23

Ты пытаешься нарисовать все меши с одним набором стейтов (SetTextureStageState), это неправильно.
Убирай секцию стейтов из InitGeometry и ставь непосредственно перед отрисовкой моделей их стейты.
SetTexture 0 тут вставлять не нужно, всё равно это задаётся в DrawGameMesh и DrawPazMesh.
Процедура Render станет такой:
Код: Выделить всё
Private Sub Render()
  d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1, 0
  d3dDevice.BeginScene

'=====================================================================
' Стейты для ландшафта
  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE

  d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_DIFFUSE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT
 
  d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_DISABLE
  DrawGameMesh Platform, 0, 0, 0
 
'=====================================================================
' Рендер модели с 2-мя текстурами
  d3dDevice.SetTexture 1, TexBetonDet

' Стейты для двух текстур
  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE

  d3dDevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 0
  d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT

  d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG1, D3DTA_DIFFUSE
  d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG2, D3DTA_CURRENT

  DrawPazMesh Paz, 8, 15, 0
 
'=====================================================================
' Рендер модели без детальной текстуры
' Стейты для одной текстуры
  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE

  d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_DIFFUSE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT
 
  d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_DISABLE
 
  DrawPazMesh Paz, -8, 15, 0
'=====================================================================
 
  Label1.Caption = "FPS - " & Me.Caption
 
  d3dDevice.EndScene
  d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

Использование Label на форме в полноэкранном режиме неправильно. У тебя оно может и работать, а у меня, например, мелькает. Если используешь какую-либо графику, кроме Direct3D, то ставь оконный режим и разворачивай окно на весь экран (Maximized).

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 133
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Смешивание текстур и Diffuse?

Сообщение longwair » 12.11.2020 (Чт) 13:54

Спасибо Mikle, то есть все эти наборы стейтов можно скинуть в какой нибудьCase и выборочно пользоваться.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Смешивание текстур и Diffuse?

Сообщение Mikle » 12.11.2020 (Чт) 14:47

А зачем Case?
Просто сделать несколько процедур, типа SetStates2TexDiff, SetStates1TexDiff, SetStates2Tex, SetStates1Tex.
То есть на все случаи, какие есть в программе.
Заметь, для ландшафта и для бетона без детализации применён одинаковый стейт, это был бы SetStates1TexDiff.


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

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

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

    TopList