19.May.2013 at 19 | Be the first to comments
For last project i was need show part of main display to distant big screen, connected to another PC. So i need somehow send video feed via Ethernet. Firstly i tried find any encoder lib for sending h264 video, but this was so complicated. So i did small Socket server in adobe air for this distant big screen PC and wrote some code in c# for unity client.
There is 2 ways for sending images to flash via sockets.
1. Send uncompressed bitmap data (ARGB = 4 bytes) from Unity and then use bitmapData.setPixels(rect, byteArray) for recteate bitmap
2. Convert bitmap data into PNG in Unity via Texture2D.EncodeToPNG and them use Loader.loadBytes() in flash.
some code below
Read the rest of this entry →
Tagged: AIR, Flash, Unity3D
Ads:
See more bankruptcy chapter 13 at bankruptcychapter7.us Греческие иконы
12.May.2013 at 12 | Be the first to comments
Hi friends!
I was very busy last months, so didn't update blog. Now i slowly learn Unity3D (such a great tool) for using it in my future projects. Slowly abandoning Flash and Processing. Love how Unity3D handle DirectX11 stuff. All those compute shaders etc.. ) During learning and doing some of my test projects, i was needed convert GPU texture to BITMAP for sending it to printer, so i wrote this small piece of code and want to share it )
I'm not C++ programmer, but this code is working )
If you know how to optimize it, just send me a comment )
Well, there is 2 parts:
1. For DirectX9 conversion
HGDIOBJ extractBitmap(void* texture){
HBITMAP hBitmapTexture = NULL;
HGDIOBJ hBitmap;
IDirect3DTexture9* d3dtex = (IDirect3DTexture9*)texture;
D3DSURFACE_DESC desc;
d3dtex->GetLevelDesc (0, &desc);
D3DLOCKED_RECT lr;
d3dtex->LockRect (0, &lr, NULL, 0);
hBitmapTexture = CreateCompatibleBitmap(GetDC(NULL), desc.Width, desc.Height);
SetBitmapBits(hBitmapTexture,lr.Pitch*desc.Height,lr.pBits);
hBitmap = CopyImage(hBitmapTexture,IMAGE_BITMAP,desc.Width,desc.Height,LR_CREATEDIBSECTION);
d3dtex->UnlockRect (0);
return hBitmap;
}
2. and for DIrectX11 conversion
HGDIOBJ extractBitmap(void* texture){
HBITMAP hBitmapTexture = NULL;
HGDIOBJ hBitmap;
ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)texture;
D3D11_TEXTURE2D_DESC desc;
d3dtex->GetDesc (&desc);
ID3D11Texture2D* pNewTexture = NULL;
D3D11_TEXTURE2D_DESC description;
d3dtex->GetDesc( &description );
description.BindFlags = 0;
description.CPUAccessFlags = D3D11_CPU_ACCESS_READ| D3D11_CPU_ACCESS_WRITE;
description.Usage = D3D11_USAGE_STAGING;
HRESULT hr = g_D3D11Device->CreateTexture2D( &description, NULL, &pNewTexture );
ID3D11DeviceContext* ctx = NULL;
g_D3D11Device->GetImmediateContext (&ctx);
ctx->CopyResource( pNewTexture, d3dtex );
D3D11_MAPPED_SUBRESOURCE resource;
UINT subresource = D3D11CalcSubresource( 0, 0, 0 );
ctx->Map( pNewTexture, subresource, D3D11_MAP_READ_WRITE, 0, &resource );
// COPY from texture to bitmap buffer
uint8_t* sptr = reinterpret_cast<uint8_t*>( resource.pData );
uint8_t* dptr = new uint8_t[desc.Width*desc.Height*4];
for( size_t h = 0; h < desc.Height; ++h )
{
size_t msize = std::min<size_t>( desc.Width* 4, resource.RowPitch );
memcpy_s( dptr, desc.Width*4, sptr, msize );
sptr += resource.RowPitch;
dptr += desc.Width * 4;
}
dptr -= desc.Width*desc.Height*4;
// SWAP BGR to RGB bitmap
uint32_t *dPtr = reinterpret_cast<uint32_t*>(dptr);
for( size_t count = 0; count < desc.Width*desc.Height*4; count += 4 ) { uint32_t t = *(dPtr); uint32_t t1 = (t & 0x00ff0000) >> 16;
uint32_t t2 = (t & 0x000000ff) << 16;
uint32_t t3 = (t & 0x0000ff00);
uint32_t ta = (t & 0xFF000000);
*(dPtr++) = t1 | t2 | t3 | ta;
}
hBitmapTexture = CreateCompatibleBitmap(GetDC(NULL), desc.Width, desc.Height);
SetBitmapBits(hBitmapTexture,desc.Width*desc.Height*4,dptr);
hBitmap = CopyImage(hBitmapTexture,IMAGE_BITMAP,desc.Width,desc.Height,LR_CREATEDIBSECTION);
}
Tagged: Programming, Unity3D
Ads:
Онлайн скачать игры для девочек. Kipor
2.Apr.2013 at 2 | Be the first to comments
Tagged: Augment Reality
Ads:
Никак не могу попасть в Одноклассники, что делать?