Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузка изображения на текстуру 
:(
    Опции темы
2faust
Дата 26.4.2013, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Добрый день, друзья.
Буду Вам очень благодарен если есть возможность решить проблему, а именно не могу вывести изображение на экран.

Вот предоставляю некоторый фрагмент кода:

// функция инициализации
Код

HRESULT CAPInitialize(  HWND hWnd,  
                         LPDIRECT3DDEVICE9 _pDirect3Device, 
                         DWORD RenderWidth, DWORD RenderHeight, 
                         DWORD CaptureWidth, DWORD CaptureHeight, 
                         BOOL InvertSource, 
                         BOOL StereoCameras,
                         int StereoMode )
{
  LogOut2("\nEnter to CAPInitialize!\n");
  
  HRESULT    hr;
  
  HBITMAP    hBitmap;
  BITMAP     Bitmap;

  
  D3DLOCKED_RECT  D3DLockRect;
  BYTE            *pTxtBits;       //! texture buffer
  //BYTE          *pLineTxtBits;
  //LONG          TxtPitchL;       // Pitch of texture
  
  
  //...  
  
  //! 
  g_hWnd = hWnd;
  
  hBitmap = NULL;
  hBitmap = (HBITMAP)::LoadImage( NULL,
                                  "Directx.bmp", 
                                  IMAGE_BITMAP, 0, 0, 
                                  LR_LOADFROMFILE | LR_CREATEDIBSECTION );
  if( !hBitmap )
  {
     LogOut2("ERROR: Error loading bmp file!");
     return S_FALSE;
  }
  GetObject( hBitmap, sizeof(BITMAP), &Bitmap );

  //! Set mono/stereo capture support.
//===  
  bCAPStereoCameras = StereoCameras;
  iCAPStereoMode    = StereoMode;
  
  CaptureWidth      = Bitmap.bmWidth;
  CaptureHeight     = Bitmap.bmHeight;
  
  CAPCaptureWidthL  = CaptureWidth;
  CAPCaptureHeightL = CaptureHeight;
  
  CAPRenderWidthL   = RenderWidth;
  CAPRenderHeightL  = RenderHeight;
//===

#if defined(__defSCREENVERTEX__)

  //! Загружаем текстру
  if( FAILED( D3DXCreateTextureFromFile( _pDirect3Device, "Directx.bmp"/*!*/, &g_pTextureLeft/*!*/ ) ) )//!
  {
     LogOut2("ERROR: UNABLE to access LEFT Capture texture!");
     return E_FAIL;
   }
   LogOut2("SUCCESS: Creates a texture from a file to the LEFT camera!");


            
   if( bCAPStereoCameras )
   {
  
       //! Загружаем текстру
      if( FAILED( D3DXCreateTextureFromFile( _pDirect3Device, "Directx.bmp"/*!*/, &g_pTextureRight/*!*/ ) ) )//!
      {
          LogOut2("ERROR: UNABLE to access RIGHT Capture texture!");
          return E_FAIL;
      }
       LogOut2("SUCCESS: Creates a texture from a file to the RIGHT camera!");
    
  
  }// if( bCAPStereoCameras )
  
  g_pTextureLeft->LockRect( 0, &D3DLockRect, 0, 0 );
  {
  
     //! КОПИРОВАНИЕ
    
     pTxtBits             = static_cast<BYTE *>(D3DLockRect.pBits);
     //DWORD* pBitmapBits = (DWORD*)Bitmap.bmBits;
     //pLineTxtBits       = pTxtBits;
     //TxtPitchL          = D3DLockRect.Pitch;
    
     for(int row = 0; row < CAPCaptureHeightL; row++ )
     {
        // DWORD* pPixels = (DWORD*)pLineTxtBits; 
      
        for (int col = 0; col < CAPCaptureWidthL; col++)
        {
           // pPixels = pBitmapBits;
              
           //! закраска оранжевым цветом
           pTxtBits[0]  = 0xEE;
           pTxtBits[1]  = 0x85;
           pTxtBits[2]  = 0x11;
           pTxtBits[3]  = 0xff; // Set Alpha, прозрачный цвет

           //! смещение индексатора
           pTxtBits    += 4;        
           //pPixels++;
           //pBitmapBits++;
        
        }// for( col )
      
        //pLineTxtBits += D3DLockRect.Pitch;
      
     }// for( row )

  }
  g_pTextureLeft->UnlockRect(0);
  
  if( bCAPStereoCameras )
  {
     g_pTextureRight->LockRect( 0, &D3DLockRect, 0, 0 );
     {
    
        //! КОПИРОВАНИЕ указателей
        pTxtBits = static_cast<byte *>(D3DLockRect.pBits);
      
        //DWORD* pBitmapBits = (DWORD*)Bitmap.bmBits;
        //pLineTxtBits= pTxtBits;      
        //TxtPitchL = D3DLockRect.Pitch;
      
        //! Закрашивание
        for(int row = 0; row < CAPCaptureHeightL; row++ )
        {
           // DWORD* pPixels = (DWORD*)pLineTxtBits;
        
           for (int col = 0; col < CAPCaptureWidthL; col++)
           {
              //! закраска оранжевым цветом 
              pTxtBits[0]  = 0xEE;
              pTxtBits[1]  = 0x85;
              pTxtBits[2]  = 0x11;
              pTxtBits[3]  = 0xff; // Set Alpha, прозрачный цвет

              pTxtBits  += 4;
              // pPixels++;
              //pBitmapBits++;          
          
           }// for( col )
        
           //pLineTxtBits += D3DLockRect.Pitch;
        
        }// for( row )

     }
     g_pTextureRight->UnlockRect(0);
    
  }// if( bCAPStereoCameras )


  //! Create Vertex buffers
  if( FAILED( hr = _pDirect3Device->CreateVertexBuffer(4*sizeof(SCREENVERTEX), 
                                                       D3DUSAGE_WRITEONLY,  
                                                       D3DFVF_SCREENVERTEX, 
                                                       D3DPOOL_MANAGED,  
                                                       &g_pLeftVertexBuff/*!*/,  
                                                       NULL) ) )//! create video Capture
  {
    LogOut2("ERROR: UNABLE to create video Capture for Left VertexBuffer!");    
    return hr;//! E_FAIL
  }
  LogOut2("SUCCESS: Create video Capture for LEFT VertexBuffer!");
  
  if( FAILED( hr = _pDirect3Device->CreateVertexBuffer(4*sizeof(SCREENVERTEX), 
                                                       D3DUSAGE_WRITEONLY,  
                                                       D3DFVF_SCREENVERTEX, 
                                                       D3DPOOL_MANAGED,  
                                                       &g_pRightVertexBuff/*!*/,  
                                                       NULL) ) )//! create video Capture
  {
    LogOut2("ERROR: UNABLE to create video Capture for Right VertexBuffer!");    
    return hr;//! E_FAIL
  }
  LogOut2("SUCCESS: Create video Capture for RIGHT VertexBuffer!");

  
#endif  // __defSCREENVERTEX__

  //! Load up screen vertexes with proper left and right eye viewport values.
  CAPSetVertex();
  
  LogOut2("Out of CAPInitialize.\n");
  return hr;
  
}// CAPInitialize()


// код рендеринга
Код

HRESULT Render3D()
{
   HRESULT hr;
  
   if(g_pDirect3DDevice == NULL)  
     return S_FALSE;
    
   if( g_bDeviceLost )
   {
      if( FAILED(hr = g_pDirect3DDevice->TestCooperativeLevel()) )
      {
         if( (D3DERR_DEVICELOST == hr) || (D3DERR_DEVICENOTRESET == hr) )
         {
            return hr;
         }
         g_bDeviceLost = FALSE;//! OK
      
      }
    
   }// if( g_bDeviceLost )
  
   //! In Side x Side mode set the ViewPort for the left eye.
   if (iIWRStereoscopyMode == SIDE_X_SIDE)
   {
      if( FAILED(hr = SetViewport(LEFT_EYE) ) )
      {
        LogOut2("ERROR: An error occurred while setting SetViewPort for LEFT_EYE regime SIDE_X_SIDE!");
        return hr;
      }
    }
  
    //! Clear the back Buffer to a red color
    g_pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 255, 0, 0 ), 1.0f, 0 );
                
    //! Render Left eye with drawprimitive
    if( FAILED(hr = CAPRenderEyes( g_pDirect3DDevice, LEFT_EYE )) )
    {
      LogOut2("ERROR: Error while in the performance CAPRenderEyes() for LEFT_EYE!");
      return hr;
    }
  
     // Render geometry for left eye
//=================================  
     if( SUCCEEDED(hr = g_pDirect3DDevice->BeginScene() ) )
     {
       g_pDirect3DDevice->EndScene();
     }
    
     //...  
  
  
//=================================  
    return S_OK;

}// Render3D()


// код рендеринга для каждого глаза:
Код

HRESULT CAPRenderEyes( LPDIRECT3DDEVICE9 _pDirect3DDevice, VWD_EYES Eye )
{

   _pDirect3DDevice->BeginScene();//!
   {
      //! отключаем z-буферы
      _pDirect3DDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
      _pDirect3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
    
    
      //! setup формат вершин обработки
      _pDirect3DDevice->SetFVF( D3DFVF_SCREENVERTEX );
    
      if( Eye == LEFT_EYE )
      {// LEFT_EYE
         //!
         _pDirect3DDevice->SetTexture( 0, g_pTextureLeft );
         _pDirect3DDevice->SetStreamSource( 0, g_pLeftVertexBuff, 0, sizeof(CUSTOMVERTEX) );    
      }
      else
      {// RIGHT_EYE
    
         if( bStereoCameras )
         {
            _pDirect3DDevice->SetTexture( 0, g_pTextureRight );
         }
         else
         {
            _pDirect3DDevice->SetTexture( 0, g_pTextureLeft );
         }
      
         _pDirect3DDevice->SetStreamSource( 0, g_pRightVertexBuff, 0, sizeof(CUSTOMVERTEX) );
      }
  
      _pDirect3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,0, 2 );
      _pDirect3DDevice->SetTexture( 0, NULL );

   }
   _pDirect3DDevice->EndScene( );//!
  
   //! восстанавливаем z-буфер
   _pDirect3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
   _pDirect3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
  
   return S_OK;

}// CAPRenderEyes() 


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

Это сообщение отредактировал(а) 2faust - 26.4.2013, 14:04
PM MAIL   Вверх
kurlyak
Дата 2.5.2013, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 7.11.2007

Репутация: 1
Всего: 3



Че то ты намутил, сам не можешь разобраться. Во первых у тя в коде вызываеться два раза BeginScene() один раз в функции CAPRenderEyes второй раз после ее вызова. В DirectX программе разрешено только один вызов BeginScene на весь проект.

Во вторых ты че то намутил неясное с загрузкой текстуры. Ты же уже ее создал функцией D3DXCreateTextureFromFile(). Зачем локать текстуру LockRect() и загружать в нее еще раз изображение которое в ней уже есть (может ты конечно какой- то эффект хочешь сделать?). Если конечно использовать D3DXCreateTexture() то значит ты сам создаешь пустую текстуру, должен ее локнуть и заполнить. Но когда исп. D3DXCreateTextureFromFile() текстура после вызова этой функ. уже готова к использованию.

Дальше у тебя вертексный буфер в экранных координатах. Ты в посте не укзал какие значения ты используешь. И вобще ты не показал в посте, что ты свои вертексные буферы локаешь, и заполняешь этими координатами. У тебя в вершином буфере 4 вершины. Первое надо локнуть каждый буфер, потом заполнить буфер экранными коорд. Например у тебя приложение запускаеться в разрешении 800 на 600. Значит v1 в буфере должно быть (0, 0), v2 в буфере должно быть (0, 600), v3 в буфере должно быть (800, 600) и v4 (0, 600). А формат вершин какой в твоей структуре SCREENVERTEX? Должно быть например так:

Код

m_pD3DDevice->SetFVF( D3DFVF_XYZRHW| D3DFVF_DIFFUSE  | D3DFVF_TEX1);


Короче тебе нжен так называемый Screen Aligned Quad - почитай что за фигня. Вот например я как это делал:

Код

LPDIRECT3DVERTEXBUFFER9 mVB;
LPDIRECT3DINDEXBUFFER9 mIB;

struct FOGVERTEX
{
D3DXVECTOR4 p;
DWORD color;
FLOAT       tu, tv;
};



int nWidth = 800;
int nHeight = 600;

FOGVERTEX* vf;
mVB->Lock( 0, 0, (void**)&vf, 0 );
    
vf[0].p = D3DXVECTOR4( 0.0, 0.0, 0.0, 1.0 );
vf[0].color =  0xff80ccff;
vf[0].tu = 0.0f;
vf[0].tv = 0.0f;

vf[1].p = D3DXVECTOR4( nWidth, 0 , 0,1.0 );
vf[1].color =  0xff80ccff;
vf[1].tu = 1.0f;
vf[1].tv = 0.0f;


vf[2].p = D3DXVECTOR4( nWidth, nHeight, 0,1.0 );
vf[2].color =  0xff80ccff;
vf[2].tu = 1.0f;
vf[2].tv = 1.0f;


vf[3].p = D3DXVECTOR4( 0, nHeight, 0,1.0 );
vf[3].color =  0xff80ccff;
vf[3].tu = 0.0f;
vf[3].tv = 1.0f;


mVB->Unlock();


WORD* indices = 0;
mIB->Lock( 0, 0, (void**)&indices, 0 );

indices[0]  = 0; indices[1]  = 1; indices[2]  = 2;
indices[3]  = 0; indices[4]  = 2; indices[5]  = 3;
mIB->Unlock();

//*********************************************************

D3DMATERIAL9 Material;
ZeroMemory(&Material, sizeof(D3DMATERIAL9));
    
Material.Diffuse.r = Material.Ambient.r = 1.0f;
Material.Diffuse.g = Material.Ambient.g = 1.0f;
Material.Diffuse.b = Material.Ambient.b = 1.0f;
Material.Diffuse.a = Material.Ambient.a = 1.0f;

m_pD3DDevice->SetMaterial(&Material);
m_pD3DDevice->SetTexture( 0, NULL );

m_pD3DDevice->SetFVF( D3DFVF_XYZRHW| D3DFVF_DIFFUSE  | D3DFVF_TEX1);

m_pD3DDevice->SetStreamSource( 0, mVB, 0, sizeof(FOGVERTEX) );
m_pD3DDevice->SetIndices(mIB);

m_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);



Вобщим разбирайся ка ты САМ!

Это сообщение отредактировал(а) kurlyak - 2.5.2013, 11:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.