Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


How to load a RGB format texture from memory using dx ?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 sainimu78   Members   -  Reputation: 121

Like
0Likes
Like

Posted 13 August 2014 - 07:39 PM

Here is my trying 

	in = cvLoadImage("24bpp_1920x1200_1.bmp", 1);

	HRESULT err;
	IDirect3DTexture9 * texture = NULL;
	///D3DFMT_L8, D3DFMT_R8G8B8
	err = D3DXCreateTexture(g_pd3dDevice, in->width, in->height, 1, 0 , D3DFMT_R8G8B8, D3DPOOL_MANAGED, &g_pTexture);
	D3DLOCKED_RECT lockRect;
	RECT rect;
	
	err = g_pTexture->LockRect(0, &lockRect, NULL, 0);//I have specified the format is RGB, then why does lockRect.Picth = 7680?

	memcpy(lockRect.pBits, in->imageData, in->widthStep*in->height);
	if(FAILED(g_pTexture->UnlockRect(0))) 
	{
		///
	}

It can't display an image in RGB format. But it can display an image in grayscale or in RGBA format. 

 

Otherwise, I want to display high resolution image like the sample of displaying image using d3d in Dx Sdk_june10".\DXSDK\Samples\InstalledSamples\Textures" does.

But, again, it can't display an image in size more than 1920x1200px approximately. 

 

How to do ?


Edited by sainimu78, 13 August 2014 - 08:22 PM.


Sponsor:

#2 tonemgub   Members   -  Reputation: 1164

Like
2Likes
Like

Posted 14 August 2014 - 01:21 AM

Does the code fail somewhere, or does it display the RGB image wrong?

If LockRect fails, then check that the texture you're using is not larger than the MaxTextureWidth and MaxTextureHeight values of the D3DCAPS9 structure returned by IDirect3D9::GetDeviceCaps. In this case, if you still want to display the source image in full resolution, you'll have to split it into multiple smaller textures, and display each of those textures separately. If you just want to use the source image as a texture for geometry, then you should really just scale down your source image - most of the time when your 3D object is in view, it will be small enough that the texture will be scaled down during rendering anyway.

 

If it doesn't fail, but displays the image wrong (skewed), then you probably have to honor the pitch value returned by LockRect. This means that you have to copy the rows from the in-memory texture data row-by row, and align each row at lockRect.Pitch bytes - i.e., after copying one row (of in->widthStep bytes) into lockRect.pBits, increase the lockRect.pBits pointer by (lockRect.Pitch - in->widthStep) - assuming that widthStep is the width, in bytes, of one row of your source image data.

 

Also, if your code fails during D3DXCreateTexture, check that your graphics card supports the D3DFMT_R8G8B8 texture format, with IDirect3D9::CheckDeviceFormat.

 

You can also use the DeviceCaps Viewer (a tool in the DirectX SDK) to check the maximum texture size and texture formats supported by your graphics card.


Edited by tonemgub, 14 August 2014 - 02:13 AM.


#3 sainimu78   Members   -  Reputation: 121

Like
0Likes
Like

Posted 14 August 2014 - 09:28 PM

Does the code fail somewhere, or does it display the RGB image wrong?

If LockRect fails, then check that the texture you're using is not larger than the MaxTextureWidth and MaxTextureHeight values of the D3DCAPS9 structure returned by IDirect3D9::GetDeviceCaps. In this case, if you still want to display the source image in full resolution, you'll have to split it into multiple smaller textures, and display each of those textures separately. If you just want to use the source image as a texture for geometry, then you should really just scale down your source image - most of the time when your 3D object is in view, it will be small enough that the texture will be scaled down during rendering anyway.

 

If it doesn't fail, but displays the image wrong (skewed), then you probably have to honor the pitch value returned by LockRect. This means that you have to copy the rows from the in-memory texture data row-by row, and align each row at lockRect.Pitch bytes - i.e., after copying one row (of in->widthStep bytes) into lockRect.pBits, increase the lockRect.pBits pointer by (lockRect.Pitch - in->widthStep) - assuming that widthStep is the width, in bytes, of one row of your source image data.

 

Also, if your code fails during D3DXCreateTexture, check that your graphics card supports the D3DFMT_R8G8B8 texture format, with IDirect3D9::CheckDeviceFormat.

 

You can also use the DeviceCaps Viewer (a tool in the DirectX SDK) to check the maximum texture size and texture formats supported by your graphics card.

 

 DeviceCaps Viewer is very helpful to underestanding 

Thank you, I know how to do






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS