积极答复者
DXGI_FORMAT里面哪个是对应24bit的

问题
-
问个问题,DXGI_FORMAT里面哪个是对应24bit的?
就是Opengl中的GL_RGB
看到msdn中一句话(Migrating to Direct3D 11):
Mapping all image content to a DXGI_FORMAT, including the removal of all 16-bit color formats (5/5/5/1, 5/6/5, 4/4/4/4), removal of all 24-bit color formats (8/8/8), and strict RGB color ordering.
http://msdn.microsoft.com/en-us/library/windows/desktop/ff476190(v=vs.85).aspx
难道不支持24bit的了?
答案
-
也就是说我数据不需要改变,直接用DXGI_FORMAT_R8G8B8A8 就可以了是么?
另外,请问,如何欻关键mipmap?
我的情况是: 24位数据,是从一个图片中读取过来的,手动计算了每个mip层的数据,能帮我看看以下代码是否正确吗?
VInt iLevel = V_log((float)iSrcWidth)/V_log((float)2)+1;//iLevel = 7 //描述一个纹理对象 D3D11_TEXTURE2D_DESC textureDesc = {0}; textureDesc.Width = 64; textureDesc.Height = 64; textureDesc.SampleDesc.Count = 1; textureDesc.SampleDesc.Quality = 0; textureDesc.Usage = D3D11_USAGE_DEFAULT; textureDesc.CPUAccessFlags = 0; textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; textureDesc.MiscFlags = 0; textureDesc.MipLevels = iLevel-1; textureDesc.ArraySize = 1; switch (uiBits) { //暂时按照32位处理 case 32: case 24: textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; break; default: break; } //计算每一mipmap层的数据 VInt iSrcWidthBits = iSrcWidth*4; VInt iYoffset = 0; VChar* pBuffer = (VChar*)CVMem::Allocate( iSrcWidthBits*iSrcHeight, __FILE__, __LINE__ ); if( pBuffer == V_NULL ) { hTextrue.ReleaseAndGetAddressOf(); return 0; } D3D11_SUBRESOURCE_DATA* InitDataArray = new D3D11_SUBRESOURCE_DATA[iLevel-1]; D3D11_SUBRESOURCE_DATA Data; // // 32 16 8 4 2 1 for( VInt i = 0; i < iLevel/*-2*/; i++ ) // 0 32 48 56 60 62 { VInt iWidthTextrue = iSrcWidth>>i; VInt iHeightTextrue = iSrcHeight>>(i+1); VInt iWidthBits = iWidthTextrue*4; VChar* pBufferTmp = pBuffer; VChar* pSrcBuffer = pData + iYoffset*iSrcWidthBits; iYoffset = iYoffset + iHeightTextrue; for( VInt y = 0; y < iHeightTextrue; y++ ) { V_memcpy( pBufferTmp, pSrcBuffer, iWidthBits ); pBufferTmp += iWidthBits; pSrcBuffer += iSrcWidthBits; } Data.pSysMem = pBuffer; Data.SysMemPitch = iWidthBits ;//// Data.SysMemSlicePitch = 0; InitDataArray[i] = Data; } ThrowIfFailed( m_d3dDevice->CreateTexture2D( &textureDesc, &Data, &hTextrue) );
- 已标记为答案 1096 2012年11月10日 13:44
全部回复
-
去掉了24bit的,你可以用 DXGI_FORMAT_R8G8B8A8 多了8位的alpha通道,其他可以保持与原先24bit一样。
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
-
也就是说我数据不需要改变,直接用DXGI_FORMAT_R8G8B8A8 就可以了是么?
另外,请问,如何欻关键mipmap?
我的情况是: 24位数据,是从一个图片中读取过来的,手动计算了每个mip层的数据,能帮我看看以下代码是否正确吗?
VInt iLevel = V_log((float)iSrcWidth)/V_log((float)2)+1;//iLevel = 7 //描述一个纹理对象 D3D11_TEXTURE2D_DESC textureDesc = {0}; textureDesc.Width = 64; textureDesc.Height = 64; textureDesc.SampleDesc.Count = 1; textureDesc.SampleDesc.Quality = 0; textureDesc.Usage = D3D11_USAGE_DEFAULT; textureDesc.CPUAccessFlags = 0; textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; textureDesc.MiscFlags = 0; textureDesc.MipLevels = iLevel-1; textureDesc.ArraySize = 1; switch (uiBits) { //暂时按照32位处理 case 32: case 24: textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; break; default: break; } //计算每一mipmap层的数据 VInt iSrcWidthBits = iSrcWidth*4; VInt iYoffset = 0; VChar* pBuffer = (VChar*)CVMem::Allocate( iSrcWidthBits*iSrcHeight, __FILE__, __LINE__ ); if( pBuffer == V_NULL ) { hTextrue.ReleaseAndGetAddressOf(); return 0; } D3D11_SUBRESOURCE_DATA* InitDataArray = new D3D11_SUBRESOURCE_DATA[iLevel-1]; D3D11_SUBRESOURCE_DATA Data; // // 32 16 8 4 2 1 for( VInt i = 0; i < iLevel/*-2*/; i++ ) // 0 32 48 56 60 62 { VInt iWidthTextrue = iSrcWidth>>i; VInt iHeightTextrue = iSrcHeight>>(i+1); VInt iWidthBits = iWidthTextrue*4; VChar* pBufferTmp = pBuffer; VChar* pSrcBuffer = pData + iYoffset*iSrcWidthBits; iYoffset = iYoffset + iHeightTextrue; for( VInt y = 0; y < iHeightTextrue; y++ ) { V_memcpy( pBufferTmp, pSrcBuffer, iWidthBits ); pBufferTmp += iWidthBits; pSrcBuffer += iSrcWidthBits; } Data.pSysMem = pBuffer; Data.SysMemPitch = iWidthBits ;//// Data.SysMemSlicePitch = 0; InitDataArray[i] = Data; } ThrowIfFailed( m_d3dDevice->CreateTexture2D( &textureDesc, &Data, &hTextrue) );
- 已标记为答案 1096 2012年11月10日 13:44