Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Directx11加载纹理_C++_Directx 11 - Fatal编程技术网

C++ Directx11加载纹理

C++ Directx11加载纹理,c++,directx-11,C++,Directx 11,d3d11中D3DXCreateTextureFromFileInMemory和D3DXCreateTextureFromFileEx的替代方案是什么?简单地说,我如何将图像加载到纹理缓冲区(看起来像是ID3D10Texture2D数据类型)以便能够渲染它?这是一个广泛的问题,但希望我能帮助您找到正确的方向 在最高级别,“加载”纹理涉及以下步骤: 以某种形式将图像数据放入内存(从文件加载、生成算法等) 将图像数据转换为纹理所需的原始形式。这将取决于所需的纹理格式。例如,大多数颜色(反照率)纹理

d3d11中D3DXCreateTextureFromFileInMemory和D3DXCreateTextureFromFileEx的替代方案是什么?简单地说,我如何将图像加载到纹理缓冲区(看起来像是ID3D10Texture2D数据类型)以便能够渲染它?

这是一个广泛的问题,但希望我能帮助您找到正确的方向

在最高级别,“加载”纹理涉及以下步骤:

  • 以某种形式将图像数据放入内存(从文件加载、生成算法等)
  • 将图像数据转换为纹理所需的原始形式。这将取决于所需的纹理格式。例如,大多数颜色(反照率)纹理将采用
    DXGI_格式\u r8g8ba8_UNORM\u SRGB
    格式。此步骤可能涉及解压缩源图像文件(例如,如果是JPEG或PNG),如果格式采用不同的数据类型,则可能涉及某种形式的对话,等等
  • (可选)为纹理生成贴图。通常,出于视觉和性能方面的考虑,拥有完整的mip链是一个好主意
  • 将原始像素数据复制到纹理中。格式转换可以在这个步骤中完成(这实际上取决于实现)
对于转换部分,有很多库将加载图像文件并将其转换为原始像素数据。其中之一就是图书馆(WIC)。还有其他的,谷歌搜索也会产生很多结果

对于MIP生成,您可以自己完成,或者一些第三方映像库将为您完成此操作。D3DX还将生成mips。另一种选择是让D3D通过
ID3D11DeviceContext::GenerateMips
调用为您生成它们(不理想,但可以作为权宜之计)

顶部将原始像素数据复制到纹理中,假设它是静态(不变或“不可变”)数据,您应该像这样创建纹理:

D3D11_TEXTURE2D_DESC tdesc;

// ...
// Fill out width, height, mip levels, format, etc...
// ...

tdesc.Usage = D3D11_USAGE_IMMUTABLE;
tdesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; // Add D3D11_BIND_RENDER_TARGET if you want to go
// with the auto-generate mips route.
tdesc.CPUAccessFlags = 0;
tdesc.MiscFlags = 0; // or D3D11_RESOURCE_MISC_GENERATE_MIPS for auto-mip gen.

D3D11_SUBRESOURCE_DATA srd; // (or an array of these if you have more than one mip level)
srd.pSysMem = pointer_to_raw_pixel_data; // This data should be in raw pixel format
srd.SysMemPitch = width_of_row_in_bytes; // Sometimes pixel rows may be padded so this might not be as simple as width * pixel_size_in_bytes.
srd.SysMemSlicePitch = 0;

ID3D11Texture2D * texture;
pDevice->CreateTexture2D(&tdesc, &srd, &texture);
这将创建纹理并一次性使用像素数据填充它。您还可以使用D3D11_USAGE_DEFAULT USAGE标志创建纹理,并在创建后使用ID3D11DeviceContext::Map/Unmap调用来执行此操作(如果您偶尔会更改纹理内容,这将非常有用)


这是一个粗略的基本概述-有很多东西在网上讨论这些东西如何工作和最佳实践等肮脏的细节。我认为我能推荐的最好的事情是找到一些示例代码并进行实验

您应该查看中的和模块。另请参见。通常,您应该更喜欢使用
DDS
文件,这些文件包括mipmap,可以使用DXT/BC压缩技术进行压缩。您可以使用类似的内容加载它们,并可以在库中使用创建它们。请参阅。您也可以使用其他图像文件格式(
JPG
PNG
)等。但这需要更多的加载时间处理以满足大小要求,使用auto gen mips生成MIPMAP(通常存在质量问题),并且格式到DXT/BC的运行时转换也可能相当缓慢。可以使用WIC加载,使用WIC调整大小,并在驱动程序支持的情况下使用Direct3D 11生成mipmap。指向原始像素的指针是否应生成图像的外壳代码(字节)?行的宽度是以字节为单位的吗?外壳代码的大小是以字节为单位的吗?chuck在对原始问题的评论中提到的示例实际上是我在需要回顾所有这些工作原理时使用的。我一定要去看看。