الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية تحميل الاكساء يدويا

بدأه fouad2008 في 3 مارس 2009 · 1 رد · 1,601 مشاهدة · في DirectX
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــة ،،

قبل ايام كنت استعمل الدوال الخاصة بتحمل الاكساء D3Dx . لكن الملاحظ ان حجم ملف التطبيق يكبر جدا بستخدام هذه المكتبة . فحاولت كتابة دالة تقوم بتحميل الكساء يدويا لكن بصيغة bmp فقط .

للاسف لم انجح .

الكود كما هو

#include <d3d8.h>

#define E01 "File Not Found"


BYTE * data;
DWORD  sizeX;
DWORD  sizeY;

LPDIRECT3D8			 g_pD3D	   = NULL; 
LPDIRECT3DDEVICE8	   g_pd3dDevice = NULL; 
LPDIRECT3DVERTEXBUFFER8 g_pVB		= NULL; 
LPDIRECT3DTEXTURE8	  g_Texture	= NULL;


//Display Error Message
void hHalt(char * Emsg)
{
  MessageBox(NULL,Emsg,"MyApp",MB_OK);   
}


// load texture from bitmap file
void  LoadTexture( HWND hwnd ,char * fName)
{
  HBITMAP hBmp;
  BITMAPINFO BMInfo;
  HDC dc;
  BITMAP bmp;
  DWORD w , h;   
  dc = GetDC(hwnd); 

  hBmp = (HBITMAP) LoadImage(NULL, fName, IMAGE_BITMAP, 0, 0,
								  LR_LOADFROMFILE | LR_CREATEDIBSECTION);		  

  if ( !hBmp )
	  hHalt(E01);

  GetObject(hBmp, sizeof(bmp), &bmp);
  w = bmp.bmWidth;
  h = bmp.bmHeight;

  ZeroMemory(&BMInfo, sizeof(BMInfo));
  BMInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  
  BMInfo.bmiHeader.biBitCount = 0;	
  BMInfo.bmiHeader.biWidth = w;
  BMInfo.bmiHeader.biHeight= h;	
  BMInfo.bmiHeader.biBitCount = 24; 
  BMInfo.bmiHeader.biPlanes   = bmp.bmPlanes;	 
  BMInfo.bmiHeader.biCompression = BI_RGB;  

  const DWORD BitmapLength = ((BMInfo.bmiHeader.biWidth*BMInfo.bmiHeader.biHeight)*3); 

  data = new byte [BitmapLength];	 

  // Get the Pixels from Bitmap File
  GetDIBits(dc, (HBITMAP)hBmp, 0, BMInfo.bmiHeader.biHeight, data, &BMInfo, DIB_RGB_COLORS); 


  DeleteObject(hBmp);	  

  // Create an Empty Texture				  24bpp
  g_pd3dDevice->CreateTexture( w, h, 1, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED, &g_Texture);

  D3DSURFACE_DESC texdesc;
  g_Texture->GetLevelDesc(0, &texdesc);

  D3DLOCKED_RECT rect;

  //Fill the Texture
  g_Texture->LockRect(0, &rect, NULL, 0);

  BYTE * pSurf = (BYTE *)rect.pBits;
  BYTE* ptr	= (BYTE *)data;

   //  "data" is 32bpp  and  D3DFMT == A8R8G8B8
   //   for(DWORD y=0; y<h; y++)
   //	{
   //	  memcpy((BYTE*)pSurf,(BYTE*)ptr,w*sizeof(DWORD));
   //	  ptr   += w*4;
   //	  pSurf += rect.Pitch/4;
   //   } 


  //  "data" is 24bpp  and  D3DFMT == R8G8B8
	   for(DWORD y=0; y<h; y++)
	  {
		 for(DWORD x=0; x<w; x++)
		 {
			CopyMemory(pSurf,ptr+x*4,3);
			pSurf += 3;
		 }
		 ptr += w*4;
		 pSurf = ((BYTE*)rect.pBits)+y*rect.Pitch;
	  }  

  g_Texture->UnlockRect(0); 


}

تم تعديل هذه المشاركة بواسطة fouad2008 في 3 مارس 2009 في 16:41

#2

وعليكم السلام ورحمة الله وبركاته ,

ليس لدي معرفة بدوال directx .. لكن هناك أمورأظن يمكت تعديلها ليعمل البرنامج :

الصورة التي تحملها عن طريق LoadImage تكون BGR

HBITMAP hBMP;	// مقبض الصورة
BITMAP	BMP;	// تركيب يحوي بيانات الصورة						
// تحميل الصورة
hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), fName , IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
if (!hBMP)// Does The Bitmap Exist?
   return FALSE;									
// If Not Return False
 GetObject(hBMP, sizeof(BMP), &BMP);  

int width = BMP.bmWidth;
int height= BMP.bmHeight;
// BMP.bmBits  -> مصفوفة الالوان
// BGR  - > ترتيب الألوان
// اذا الدايركت اكس لايدعم هذا الترتيب..
//unsigned char *newBuffer = new unsigned char[width*height*3];
/* for(int i=0;i<width*height*3;i+=3)
/{
	   newBuffer = BMP.bmBits[ i+2 ]; 
	   newBuffer[i+1]=BMP.bmpBits[i+1];
	  newBuffer[i+2] =BMP.bmpBits;	   
}

لذلك لاداعي GetDIBits , بالنسبة للـ LockRect , لا أعرف كيف تعمل .. سأبحث ان شاء الله , اذا لم يفيدك أحد الاخوة بذلك ..

تم تعديل هذه المشاركة بواسطة الشمري في 3 مارس 2009 في 18:59

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة