以 DirectX 编程方式创建纹理

2024-02-10

我试图通过提供 rgba 值数组、使用该数组创建 ID3D11Texture2D 资源,然后将其映射到我的 20 x 20 正方形,在屏幕上创建一个白色 20 x 20 像素正方形。

以下是创建方形纹理和着色器资源视图的代码:

void Square::CreateSquareTexture(float *color)
{
    float *texArray = (float *)malloc(4 * 20 * 20 * sizeof(float));

    for (int i = 0; i < 20 * 20 * 4; i++)
        texArray[i] = 1.0f;

    ID3D11Texture2D *boxTex = 0;

    D3D11_TEXTURE2D_DESC boxTexDesc;
    ZeroMemory(&boxTexDesc, sizeof(D3D11_TEXTURE2D_DESC));
    boxTexDesc.ArraySize = 1;
    boxTexDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    boxTexDesc.CPUAccessFlags = 0;
    boxTexDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    boxTexDesc.Height = 20;
    boxTexDesc.MipLevels = 1;
    boxTexDesc.MiscFlags = 0;
    boxTexDesc.SampleDesc.Count = 4;
    boxTexDesc.SampleDesc.Quality = m_4xMsaaQuality - 1;
    boxTexDesc.Usage = D3D11_USAGE_DEFAULT;
    boxTexDesc.Width = 20;

    D3D11_SUBRESOURCE_DATA boxTexInitData;
    ZeroMemory(&boxTexInitData, sizeof(D3D11_SUBRESOURCE_DATA));
    boxTexInitData.pSysMem = texArray;

    m_d3dDevice->CreateTexture2D(&boxTexDesc, &boxTexInitData, &boxTex);
    m_d3dDevice->CreateShaderResourceView(boxTex, NULL, &m_d3dSquareSRV);
}

这是我的像素着色器:

Texture2D squareMap : register(t0);
SamplerState samLinear : register(s0);

struct PixelIn
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
};

float4 main(PixelIn pin) : SV_TARGET
{
    float4 texColor = squareMap.Sample(samLinear, pin.Tex);

    return texColor;
}

但是,我的方块看起来全黑。我已经尝试使用文件中的普通 .dds 纹理进行此操作,并且它有效,但为什么我不能以编程方式创建自己的纹理?我究竟做错了什么?


您的纹理数组与您指定的格式不匹配。

DXGI_FORMAT_R8G8B8A8_UNORM一种四分量 32 位无符号归一化整数格式,支持每个通道 8 位(包括 Alpha)。

您为 texArray 的每个通道传递四个浮点数(尝试使用 unsigned char 代替)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以 DirectX 编程方式创建纹理 的相关文章

  • C中函数指针的递归声明

    我想声明一个返回指向相同类型函数的指针的函数 我想用它来实现如下状态机 typedef event handler t event handler t event t compilation error event handler t st
  • is_integral 与 is_integer:其中之一是多余的吗?

    是积分 http en cppreference com w cpp types is integral and 是整数 http en cppreference com w cpp types numeric limits is inte
  • 点精灵的缩放 (Direc3D 9)

    请告诉我应该为 D3DRS POINTSCALE A D3DRS POINTSCALE B D3DRS POINTSCALE 设置什么值 以像场景中的其他对象一样缩放点精灵 参数 A 0 B 0 和 C 1 由 F D Luna 提出 不合
  • 如何将不记名令牌发送到 ASP NET MVC 5 中的视图?

    我有一个 NET MVC and WEB API项目 我想打电话给WEB API controllers来自 javascript 但我没有找到将令牌发送到我的视图的方法 我想添加bearer token in Viewbag变量 使用以下
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 动态选择和更新 LINQ 结果集中的列值

    我有一个场景 其中存在 LINQ 结果集 我使用了以下查询 var stockDetails from d in db BloodBanks where d bbUserName Session username ToString sele
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 修改正在运行的可执行文件的资源内容

    All 我将应用程序设置存储在资源中 当我的程序首次加载时 我使用 WinAPI 读取指定的资源 然后我解析检索到的字节数据 这对我来说完美无缺 现在假设用户更改了我的应用程序中的设置 他 她检查复选框控件 我想将更新的设置保存到我的资源中
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • Nuget - 对象引用未设置为对象的实例

    我在 vs 2015 中遇到了 nuget 包管理器的问题 像Unity这样的一些包已经安装没有问题了 某些软件包 例如 EF 在安装时出现问题 像 Automapper 这样的一些软件包也有同样的问题 但是当我安装这个软件包的另一个版本时
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 如何在 Visual Studio 2010 Express 中引用 system.drawing?

    我对此有点陌生 我的印象是要绘制我创建的矩形 我需要使用 system drawing graphics 问题是 我收到错误 命名空间 System 中不存在类型或命名空间名称 drawing 您是否缺少程序集引用 当我右键单击解决方案资源
  • 为什么未到达的 try-catch 块会增加运行时间?

    我目前正在创建自己的容器库 但我已经看到无法访问 if 语句无效 try catch阻止增加运行时间 这是我的测试 Vector cpp template
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • 使用非字符串作为字符串(而不是自动使用 ToString)时如何显示错误?

    建议的重复确实是一个类似的问题 然而 答案只涵盖一种选择 禁用 ToString 本身 还有其他可能的解决方案 例如让 Visual Studio 警告我 或者不调用 ToString 仔细阅读那里的答案 他认为is调用 只是解释说没有办法
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码

随机推荐