none
DXGI_FORMAT里面哪个是对应24bit的 RRS feed

  • 问题

  •  问个问题,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的了?
    2012年10月23日 2:07

答案

  • 也就是说我数据不需要改变,直接用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
    2012年10月25日 8:01

全部回复

  • 去掉了24bit的,你可以用  DXGI_FORMAT_R8G8B8A8  多了8位的alpha通道,其他可以保持与原先24bit一样。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年10月24日 5:34
    版主
  • 也就是说我数据不需要改变,直接用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
    2012年10月25日 8:01