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

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

Модератор: Mikle

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 137
Зарегистрирован: 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
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4029
Зарегистрирован: 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
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 137
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

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

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

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

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

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

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

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

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

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

Сообщение longwair » 05.02.2021 (Пт) 11:23

Mikle,

Добавил в проект смешивание по маске, и вылетело по моему вообще всё))) кроме текстур по маске. Кручу верчу эти стейты, диффузы, текстуры, и думаю про себя как же трудно жить дураком.
все стейты в Render. Прописал всё, запустил и опа работает лашдшафт с текстурами по маске, на модельке с обычной текстуркой работает только диффуз текстуры нет, на модельке с детальной текстуркой, работает только диффуз и детальная текстурка, первой текстурки нет.
Код: Выделить всё
'Смешиваем
    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_DIFFUSE
    d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT
 
    d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_DISABLE

' Рендер модели без детальной текстуры
    DrawPazMesh Paz, -8, 15, 0
   
'Смешиваем
    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 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
' Рендер модели с детальной текстурой
    d3dDevice.SetTexture 1, TexBetonDet
    DrawPazMesh Paz, 8, 15, 0
   
    'Смешиваем Ландшафт
    d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
    d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
    d3dDevice.SetTextureStageState 0, D3DTSS_RESULTARG, D3DTA_TEMP
   
    d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
    d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
    d3dDevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 0
   
    d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_LERP
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG0, D3DTA_TEMP
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG1, D3DTA_CURRENT
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG2, D3DTA_TEXTURE
    d3dDevice.SetTextureStageState 2, D3DTSS_TEXCOORDINDEX, 0
   
    d3dDevice.SetTextureStageState 3, D3DTSS_COLOROP, D3DTOP_MODULATE
    d3dDevice.SetTextureStageState 3, D3DTSS_COLORARG1, D3DTA_CURRENT
    d3dDevice.SetTextureStageState 3, D3DTSS_COLORARG2, D3DTA_DIFFUSE
   
    'd3dDevice.SetTexture 0, TexMask
    d3dDevice.SetTexture 1, TexGrass
    d3dDevice.SetTexture 2, TexMerble
    DrawGameMesh Platform, 0, 0, 0

' Отменяем стадии
    d3dDevice.SetTexture 0, Nothing
    d3dDevice.SetTexture 1, Nothing
    d3dDevice.SetTexture 2, Nothing

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

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

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

Сообщение longwair » 05.02.2021 (Пт) 11:29

Если с этим разберусь то наверное рискну и тоже подам заявку на конкурс шутеров. Хотя потерпят ли там ещё одного "Бейсиканутого"))))
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

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

Сообщение Mikle » 05.02.2021 (Пт) 11:41

Убери из DrawPazMesh и DrawGameMesh строки с SetTexture.
Процедура 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 0, D3DTSS_COLORARG2, D3DTA_CURRENT

    d3dDevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 0
    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

' Рендер модели без детальной текстуры
    d3dDevice.SetTexture 0, TexBeton
    DrawPazMesh Paz, -8, 15, 0
   
'Смешиваем
    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 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
' Рендер модели с детальной текстурой
    d3dDevice.SetTexture 0, TexBeton
    d3dDevice.SetTexture 1, TexBetonDet
    DrawPazMesh Paz, 8, 15, 0

    'Смешиваем Ландшафт
    d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
    d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
    d3dDevice.SetTextureStageState 0, D3DTSS_RESULTARG, D3DTA_TEMP

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

    d3dDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_LERP
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG0, D3DTA_TEMP
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG1, D3DTA_CURRENT
    d3dDevice.SetTextureStageState 2, D3DTSS_COLORARG2, D3DTA_TEXTURE
    d3dDevice.SetTextureStageState 2, D3DTSS_TEXCOORDINDEX, 0

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

    d3dDevice.SetTexture 0, TexMask
    d3dDevice.SetTexture 1, TexGrass
    d3dDevice.SetTexture 2, TexMerble
    DrawGameMesh Platform, 0, 0, 0

' Отменяем стадии
    d3dDevice.SetTextureStageState 0, D3DTSS_RESULTARG, D3DTA_CURRENT
   
    Label1.Caption = "FPS - " & Me.Caption
   
  d3dDevice.EndScene
  d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

Проблема была в том, что для ландшафта менялся RESULTARG и не восстанавливался.

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

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

Сообщение longwair » 05.02.2021 (Пт) 12:00

Mikle,
Огромное спасибо. Кажись понял))). Только вот зачем из DrawGameMesh... убирать SetTexture? Вроде и с ними работает
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

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

Сообщение Mikle » 05.02.2021 (Пт) 12:02

longwair писал(а):Если с этим разберусь то наверное рискну и тоже подам заявку на конкурс шутеров. Хотя потерпят ли там ещё одного "Бейсиканутого"))))

Проблема будет не в бейсике, а в использовании dx8vb, которую на семёрке-десятке приходится с трудом регистрировать.

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

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

Сообщение Mikle » 05.02.2021 (Пт) 12:04

longwair писал(а):зачем из DrawGameMesh... убирать SetTexture? Вроде и с ними работает

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

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

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

Сообщение longwair » 06.02.2021 (Сб) 16:05

Mikle писал(а):
longwair писал(а):Проблема будет не в бейсике, а в использовании dx8vb, которую на семёрке-десятке приходится с трудом регистрировать.


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


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

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

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

    TopList