Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 00:19   #1
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию Проблема с прозрачностью частиц(DirectX).

Взял из книги по DirectX программу, создающую систему частиц.
Решил сделать что-то напоминающее дым. Поковыряв ее, добился того, чтобы частицы двигались в определенном направлении, но немного расходились от центра к краям. Но когда я заменил текстуры , они стали смешиваться очень сильно с фоном. Причем как-то странно. Более того он не видит альфа канал текстур. Короче я совсем запутался. Очень прошу помочь.
Текстуру дыма брал отсюда: http://video10.videocopilot.net/efc5...rojects/63.zip


Очень много чего не влезло просто в сообщение, я оставил только основное.

Код:
IDirect3D9       *g_pD3D       = NULL;
IDirect3DDevice9 *g_pD3DDevice = NULL;
// The particle vertex format and descriptor
typedef struct {
  FLOAT x, y, z;   
  D3DCOLOR Diffuse; 
  FLOAT u, v;       
} sVertex;
#define VERTEXFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)
// The Particle vertex buffer and texture
IDirect3DVertexBuffer9 *g_pParticleVB      = NULL;
IDirect3DTexture9      *g_pParticleTexture = NULL;

typedef struct sParticle {
  float    XPos, YPos, ZPos;  
  float    XAdd, YAdd, ZAdd;  
  //float    Red, Green, Blue;  
  long     Timer, Counter;    
 sParticle()
  {
    // Position particle at origin
    XPos = YPos = ZPos = 0.0f;
    // Get a random update counter
    Counter = rand() % 50 + 10;
    Timer = 0;
    // Get a random speed
    XAdd = 5.0f;
    YAdd = (float)(rand() % 11) - 5.0f;
    ZAdd = (float)(rand() % 11) - 5.0f;
  }
} sParticle;
sParticle *g_pParticles = NULL;
BOOL DoFrame()
{
  D3DXMATRIX matView, matWorld, matTransposed, matTrans,matWorld1;
  static D3DMATERIAL9 Mat;
  static BOOL InitMat = TRUE;
  static DWORD Counter = timeGetTime();
 // Limit to 30fps
  if(timeGetTime() < Counter+33)
    return TRUE;
  Counter = timeGetTime();
 // Configure the material if first time called
  if(InitMat == TRUE) {
    InitMat = FALSE;
    ZeroMemory(&Mat, sizeof(Mat));
    Mat.Diffuse.a = Mat.Ambient.a = 0.5f;
  }
 // Clear device backbuffer
  g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0,45,128,255), 1.0f, 0);
 if(SUCCEEDED(g_pD3DDevice->BeginScene())) {
// Set the particle source, shader, and texture
    g_pD3DDevice->SetStreamSource(0, g_pParticleVB, 0, sizeof(sVertex));
    g_pD3DDevice->SetFVF(VERTEXFVF);
    g_pD3DDevice->SetTexture(0, g_pParticleTexture);
   // Get and set the transposed view matrix 
    g_pD3DDevice->GetTransform(D3DTS_VIEW, &matView);
    D3DXMatrixTranspose(&matTransposed, &matView);
  // Enable alpha blending
    g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
 // Loop through all particles and draw them
    for(short i=0;i<800;i++) {

      // Move particle first
      g_pParticles[i].XPos += g_pParticles[i].XAdd;
      g_pParticles[i].YPos += g_pParticles[i].YAdd;
      g_pParticles[i].ZPos += g_pParticles[i].ZAdd;
// Reverse movements if past counter
      if((g_pParticles[i].Timer += 1) >= g_pParticles[i].Counter) {
        g_pParticles[i].Timer = 0;
        g_pParticles[i].XPos = 0.0f;
        g_pParticles[i].YPos =0.0f;
        g_pParticles[i].ZPos = 0.0f;
      }
      else
	   {
g_pParticles[i].XAdd *= 1.0f;
        g_pParticles[i].YAdd *= 1.0f;
        g_pParticles[i].ZAdd *= 1.0f;
	   }
       // Setup the particle's world transformation
      D3DXMatrixTranslation(&matTrans, g_pParticles[i].XPos, \
       g_pParticles[i].YPos, \
       g_pParticles[i].ZPos);
      D3DXMatrixMultiply(&matWorld, &matTrans, &matTransposed);
      D3DXMatrixRotationZ(&matWorld1, 1);
      D3DXMatrixMultiply(&matWorld, &matWorld,&matWorld1);
	  //D3DXMatrixRotationZ(&matWorld, (float)timeGetTime() / 1000.0f+78);
      g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);

      // Set the particle's material
      Mat.Diffuse.r = Mat.Ambient.r = 1.0;
      Mat.Diffuse.g = Mat.Ambient.g = 1.0;
      Mat.Diffuse.b = Mat.Ambient.b = 1.0;
      g_pD3DDevice->SetMaterial(&Mat);
   // Draw the particle
      g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    }

   
    g_pD3DDevice->SetTexture(0, NULL);

    
    g_pD3DDevice->EndScene();
  }

  g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

  return TRUE;
}

BOOL SetupParticles()
{
  BYTE *Ptr;
  sVertex Verts[4] = {не влезло
    
  };

  // Create vertex buffers and set data
  g_pD3DDevice->CreateVertexBuffer(sizeof(Verts)*4, 0,        \
                  VERTEXFVF, D3DPOOL_DEFAULT,                 \
                  &g_pParticleVB, NULL);
  g_pParticleVB->Lock(0,0, (void**)&Ptr, 0);
  memcpy(Ptr, Verts, sizeof(Verts));
  g_pParticleVB->Unlock();

  // Get textures 
  D3DXCreateTextureFromFile(g_pD3DDevice, "Smoke Element.jpg", &g_pParticleTexture);

  // Create some particles
  g_pParticles = new sParticle[800]();

  return TRUE;
}
zipwind вне форума Ответить с цитированием
Старый 03.06.2011, 12:10   #2
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Может я чего то не понимаю но у jpg нет альфа канала
RomiKon вне форума Ответить с цитированием
Старый 03.06.2011, 12:20   #3
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию

Хм, вот я шас тоже задумался насчет того, какой я бред несу. Проблему отсутсвия альфа канала я решил(но для другой картинки). Добавил
Код:
g_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x01);
  g_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
Но тем не менее частицы очень сильно смешиваются. Не понимаю почему и как это изменить. + Мне почему-то казалось что когда я грузил картинку в фотошоп все было окей.

Последний раз редактировалось zipwind; 03.06.2011 в 12:59.
zipwind вне форума Ответить с цитированием
Старый 03.06.2011, 13:15   #4
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Покажите скриншот, по вашим словам проблема не совсем ясна
RomiKon вне форума Ответить с цитированием
Старый 03.06.2011, 14:01   #5
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию

Все вспомнил. Оказывается я в фотошопе вырезал задний фон сам, но об этом забыл.
Но тем не менее нормально прозрачность не удалось настроить. Вот скрин:

Как видно, спрайты прозрачные, сильно сливаются с фоном, а на те места, где в одной точке их оказалось несколько смотреть даже страшно. Они должны быть прозрачными, но не настолько. Вот в чем дело.
zipwind вне форума Ответить с цитированием
Старый 03.06.2011, 16:24   #6
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

дело в том что текстура частицы полупрозрачна поэтому и смешивается с фоном, такое возможно в двух случаях:
1)сама текстура является полупрозрачной, перерисуйте её граф.редакторе
2)полигон на который натягивается текстура имеет полупрозрачный цвет, альфа цвет полигона должен быть 1.0

Вот эта строчка скорее всего задаёт прозрачность Mat.Diffuse.a = Mat.Ambient.a = 0.5f;
Нужно 0.5 заменить на 1.0

Последний раз редактировалось RomiKon; 03.06.2011 в 16:27.
RomiKon вне форума Ответить с цитированием
Старый 03.06.2011, 17:07   #7
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию

Пробовал, не особо помогло. Текстуры пробовал разные.
zipwind вне форума Ответить с цитированием
Старый 03.06.2011, 17:14   #8
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

// Set the particle's material
Mat.Diffuse.r = Mat.Ambient.r = 1.0;
Mat.Diffuse.g = Mat.Ambient.g = 1.0;
Mat.Diffuse.b = Mat.Ambient.b = 1.0;
Mat.Diffuse.a = Mat.Ambient.a = 1.0;
g_pD3DDevice->SetMaterial(&Mat);
А так делал?
RomiKon вне форума Ответить с цитированием
Старый 03.06.2011, 17:33   #9
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию

В смысле установить прозрачность перед самой установкой материала?
Да, попробовал, ничего не изменилось. Сейчас конечно попробую текстуру еще раз поменять.
zipwind вне форума Ответить с цитированием
Старый 03.06.2011, 21:02   #10
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию

Нет, смена текстур ничего не дала.
zipwind вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с прозрачностью OpenGL saggy Мультимедиа в Delphi 0 02.07.2010 22:02
Проблема с прозрачностью (Transparent) Pyton Gamedev - cоздание игр: Unity, OpenGL, DirectX 12 26.02.2010 21:02
Проблема с DirectX k1r1ch Общие вопросы Delphi 5 18.09.2009 17:41
Восстановление Треков частиц(фитирование) winny Общие вопросы C/C++ 0 01.10.2008 13:55