DX11创建纹理 : DirectXTex

备注 :用了一下微软的这个开源代码,执行到:

ScopedObject<IWICBitmapDecoder> decoder;  
	HRESULT hr = pWIC->CreateDecoderFromFilename( fileName, 0, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &decoder );

的时候就终止了,没有获取到相应的解码器decoder指向null,可是我有可以打开tga格式的文件的软件,这是否证明我有解码器呢?由于对解码这块不是很了解,果断不挣扎,暂时放弃这种方式。

现在创建纹理是使用:

D3DX11CreateShaderResourceViewFromFile(m_pd3dDevice, L"Lightning\\c001_07.dds", NULL, NULL, &mTexture, NULL);

 这种方式的话就必须把其他格式的文件转换为dds文件。附件附上一个转换格式的软件,很小很好用。

总结:网上很多人都在困惑DX11获取纹理的方法,最好当然是什么格式的文件都支持比较好,这样也程序也显得健壮一些。但是,事情总不能像想的那么美满,暂时使用格式转换的方式解决。如果有路过的高手,请指点一下,谢谢!

 

正文:

对于3D渲染来说,纹理是一个极为常见的东西,而且一般图形格式的文件都可以作为纹理文件,在DX9和DX10的时候创建纹理是一个比较简单的操作。但是到DX11突然这种快捷就没了,D3DX淘汰也就算了,关键是D3DX里面没有支持11的纹理创建,想用淘汰货都用不了。

从这个现象其实可以看出微软的意图,过去的版本里微软或许比较在意用户的快捷,从而提供了很多快捷的方式。但是,这些快捷从某种意义上阻止了性能的提升,从而想使用DX做出更高性能的渲染引擎时,常常因为暴露的接口而变的隔靴搔痒。出于这些原因,微软在DX11以及以后的版本开始放权,这种放权导致D3DX的淘汰,也影响了包括效果框架,纹理加载之类的一系列的功能。纹理加载搬迁至DirectXTex 里面,它与效果框架一样,以一种开源代码块的方式,让用户自己组织加载纹理的工具类。

 

ID3D11Device :: CreateTexture2D 方法只能创建DDS格式的纹理,其他格式的纹理需要自己实现一个工具类。

 

通用文件创建纹理:

1.调用CoCreateInstance创建成像工厂接口(IWICImagingFactory)的。CoCreateInstance是一个通用的创建单例的方法。第一步简单理解就是创建一个IWICImagingFactory对象。

2.调用IWICImagingFactory :: CreateDecoderFromFilename的方法来创建一个IWICBitmapDecoder对象从图像文件名 ​​。创建一个位图解码器。

3.呼叫的IWICBitmapDecoder :: GetFrame方法的帧的图像检索IWICBitmapFrameDecode接口。获取位图的某一帧图像。

4.调用IWICBitmapSource :: GetPixelFormat方法(IWICBitmapFrameDecode接口继承来自IWICBitmapSource)获得的图像的像素格式。这里获取的像素格式最终会映射成DXGI的像素格式。

5.根据此表的像素格式转换到DXGI_FORMAT类型:

WIC像素格式 等效DXGI_FORMAT
GUID_WICPixelFormat128bppRGBAFloat DXGI_FORMAT_R32G32B32A32_FLOAT
GUID_WICPixelFormat64bppRGBAHalf DXGI_FORMAT_R16G16B16A16_FLOAT
GUID_WICPixelFormat64bppRGBA DXGI_FORMAT_R16G16B16A16_UNORM
GUID_WICPixelFormat32bppRGBA DXGI_FORMAT_R8G8B8A8_UNORM
GUID_WICPixelFormat32bppBGRA DXGI_FORMAT_B8G8R8A8_UNORM(DXGI 1.1)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity是一款广泛应用于游戏开发的跨平台游戏引擎,而DX11则是较新一代的DirectX图形API。共享纹理是Unity和DX11之间的一种交互方式,用于在Unity中使用DX11的功能。下面将就Unity中DX11共享纹理进行简要阐述。 首先,DX11共享纹理允许在Unity和DX11之间实现纹理资源的共享,这意味着可以在Unity中创建纹理,然后将其传递给DX11进行进一步的图形渲染处理。这种共享可以通过创建和管理ID3D11Texture2D对象来实现。 其次,为了在Unity中使用DX11共享纹理,需要建立一个安装了DX11支持的插件。这个插件将提供一些接口和函数,使得Unity能够与DX11进行交互。在使用DX11共享纹理时,需要在Unity中导入插件并设置相关的渲染纹理。 另外,由于Unity使用的是OpenGL图形API,而不是DX11,因此在使用DX11共享纹理时需要对纹理进行格式转换以适应OpenGL。这可以通过将DX11纹理复制到辅助纹理中,并将其绑定到OpenGL纹理进行实现。 最后,Unity中的脚本可以使用DX11共享纹理进行更高级的图形处理,例如实现自定义的图形特效、着色器等。通过将Unity和DX11结合起来,可以获得更高质量和更灵活的图像渲染效果,从而提升游戏的视觉体验。 总的来说,Unity中的DX11共享纹理能够实现Unity和DX11之间的纹理资源共享,需要使用支持DX11的插件并进行纹理格式转换。这种搭配可以提供更多的图形渲染功能和更好的图像效果,让游戏开发者能够更自由地实现各种图形特效和着色器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值