DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

2024-05-26

我使用时遇到问题DirectX::SpriteFont/DirectX::SpriteBatch(来自 DirectXTK;与此处讨论的问题完全相同:使用 SpriteFont 类绘制文本时出现问题 https://stackoverflow.com/questions/33860576/problems-when-drawing-text-using-the-spritefont-class).

void DrawScene(void)
{
    HRESULT hr;

    float bgColor_a[4] = { 0.0f, 0.4f, 0.8f, 0.0f };

    g_pDeviceContext->ClearRenderTargetView(g_pRenderTargetView, bgColor_a);
    g_pDeviceContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

    XMMATRIX cameraProj = XMLoadFloat4x4(&g_camera._cameraProjection);
    XMVECTOR pos = XMLoadFloat3(&g_camera._pos);
    XMVECTOR target = XMLoadFloat3(&g_camera._target);
    XMVECTOR up = XMLoadFloat3(&g_camera._up);
    XMMATRIX cameraView = XMMatrixLookAtLH(pos, target, up);
    XMMATRIX worldBox2 = XMMatrixIdentity() * (XMMatrixTranslation(2.0f, 0.0f, 0.0f) * XMMatrixRotationY(XMConvertToRadians(g_rotBox2)));
    XMMATRIX wvp = worldBox2 * cameraView * cameraProj;
    XMMATRIX transposeWvp = XMMatrixTranspose(wvp);
    XMStoreFloat4x4(&g_constantBufferPerObject._wvp, transposeWvp);
    g_pDeviceContext->UpdateSubresource(g_pConstantBufferPerObject, 0, NULL, &g_constantBufferPerObject, 0, 0);
    g_pDeviceContext->VSSetConstantBuffers(0, 1, &g_pConstantBufferPerObject);

    g_pDeviceContext->PSSetShaderResources(0, 1, &g_pCageTexture);
    g_pDeviceContext->PSSetSamplers(0, 1, &g_pCubeTextureSamplerState);

    // box
    g_pDeviceContext->DrawIndexed(36, 0, 0);

    wchar_t buffer[32];
    swprintf_s(buffer, 32, L"%.2f", g_fps._fps);

    //g_pSpriteBatch->Begin();
    //g_pSpriteFont->DrawString(g_pSpriteBatch, buffer, XMFLOAT2(30, 30));
    //g_pSpriteBatch->End();

    // Present the backbuffer to the screen
    hr = g_pSwapChain->Present(0, 0);
    if (FAILED(hr))
    {
        ErrorBoxW(L"Cannot present without error.");
    }
}

无需致电SpriteBatch::Begin(), SpriteFont::DrawString and SpriteBatch::End()您将看到一个带纹理的立方体在空间中旋转(笼子)。通过调用所描述的函数,您将只能看到左上角的每秒帧数,但看不到旋转的立方体。

我按照以下教程进行操作查克·沃尔伯恩在 github DirectXTK 上并结合了 2 个教程 Draw String usingSpriteFont并渲染一个原始的 3D 对象(一个简单的三角形)。在此示例中,我将看到测试字符串绘制在三角形上。但我不明白为什么在使用绘制文本字符串时我的示例中的旋转立方体不可见SpriteFontDirectXTK 类,我什至找不到根本原因。

像素着色器文件(PixelShader.hlsl):

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
    float2 TexCoord : TEXCOORD;
};

Texture2D ObjTexture;
SamplerState ObjSamplerState;

float4 PS( VS_OUTPUT input ) : SV_TARGET
{
    float4 diffuse = ObjTexture.Sample(ObjSamplerState, input.TexCoord);
    clip(diffuse.a - 0.25);
    return diffuse;
}

顶点着色器文件(VertexShader.hlsl):

cbuffer constantBufferPerObject
{
    float4x4 WVP;
    float ColorAdjust;
    int Mode;
    int Pad[2];
};

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
    float2 TexCoord : TEXCOORD;
};

VS_OUTPUT VS( float4 pos : POSITION, float4 color : COLOR_ZERO, float4 color2 : COLOR_ONE, float2 texCoord : TEXCOORD )
{
    VS_OUTPUT output;
    float4 temp;
    output.Pos = mul(pos, WVP);  
    temp = color;
    output.Color.r = temp.r * color2.r * (1.0f - ColorAdjust);
    output.Color.g = temp.g * color2.g * (1.0f - ColorAdjust);
    output.Color.b = temp.b * color2.b * (1.0f - ColorAdjust);
    output.Color.a = color.a * color2.a;
    output.TexCoord = texCoord;
    return output;
}

重现问题:我正在使用 Visual Studio 2015 社区版。我添加了 DirectXTK (.lib) 和 DirectXTex (WICTextureLoader.cpp/.h,DDSTextureLoader.cpp/.h、.lib) 添加到我的项目中。立方体的图像是带有 alpha 的 .png。

Note: 我创建了这个重复的问题, 至

avoid...寻求帮助、澄清或回应其他答案。

关于另一个问题。


首先,由于您使用的是 DirectXTK,因此不需要 DirectXTex。 DirectXTex 旨在用于纹理处理工具,而 DirectXTK 纹理加载器更适合在应用程序中使用。看这篇博文 http://blogs.msdn.com/b/chuckw/archive/2012/05/04/direct3d-11-textures-and-block-compression.aspx.

二、不要用古法timeGetTime功能。您可以使用GetTickCount, 虽然GetTickCount64更好,因为它避免了溢出问题。然而,对于帧计时来说,这些还不够精确。你应该看看步进定时器.h http://blogs.msdn.com/b/chuckw/archive/2014/12/03/understanding-game-time-revisited.aspx用在DirectX 工具包 https://github.com/Microsoft/DirectXTK/wiki/Getting-Started教程。

第三,你应该考虑使用Microsoft::WRL::ComPtr而不是所有的SAFE_RELEASE宏观的东西。看这一页 https://github.com/Microsoft/DirectXTK/wiki/ComPtr了解详情。

你的代码包括xinput.h以及。您应该看看使用 DirectX Tool KitGamePad https://github.com/Microsoft/DirectXTK/wiki/GamePad相反,它有很多好处。如果不出意外的话,它使用 XInput 的能力比您想象的要强。

综上所述,您的问题很简单:您可以在中设置场景的渲染状态InitScene,但是画画anythingelse 改变了状态,这正是SpriteBatch做。我记录了 DirectX Toolkit 中每个对象的渲染状态wiki https://github.com/Microsoft/DirectXTK/wiki/SpriteBatch#state-management.

如果您进行多次绘制,您需要设置绘制所需的每个帧的所有状态,而不是假设它永远设置。

void DrawScene(void)
{
    HRESULT hr;

    float bgColor_a[4] = { 0.0f, 0.4f, 0.8f, 0.0f };

    g_pDeviceContext->ClearRenderTargetView(g_pRenderTargetView, bgColor_a);
    g_pDeviceContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

//>>>> THESE WERE MOVED FROM INITSCENE ABOVE!
    // Set Vertex and Pixel Shaders
    g_pDeviceContext->VSSetShader(g_pVertexShader, 0, 0);
    g_pDeviceContext->PSSetShader(g_pPixelShader, 0, 0);

    // Set the vertex buffer
    UINT stride = sizeof(SimpleVertex);
    UINT offset = 0;
    g_pDeviceContext->IASetVertexBuffers(0, 1, &g_pTriangleVertexBuffer, &stride, &offset);

    g_pDeviceContext->IASetIndexBuffer(g_pSquareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);

    // Set the Input Layout
    g_pDeviceContext->IASetInputLayout(g_pVertexLayout);

    // Set Primitive Topology
    g_pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 3 vertices per triangle
                                                                                     //g_pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); // 1 vertex per point
                                                                                     //g_pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); // 2 vertices per line

                                                                                     // Create the Viewport

    g_pDeviceContext->RSSetState(g_pNoCullSolid);
//THESE WERE MOVED FROM INITSCENE ABOVE! <<<<

    XMMATRIX cameraProj = XMLoadFloat4x4(&g_camera._cameraProjection);
    XMVECTOR pos = XMLoadFloat3(&g_camera._pos);
    XMVECTOR target = XMLoadFloat3(&g_camera._target);
    XMVECTOR up = XMLoadFloat3(&g_camera._up);
    XMMATRIX cameraView = XMMatrixLookAtLH(pos, target, up);
    XMMATRIX worldBox2 = XMMatrixIdentity() * (XMMatrixTranslation(2.0f, 0.0f, 0.0f) * XMMatrixRotationY(XMConvertToRadians(g_rotBox2)));
    XMMATRIX wvp = worldBox2 * cameraView * cameraProj;
    XMMATRIX transposeWvp = XMMatrixTranspose(wvp);
    XMStoreFloat4x4(&g_constantBufferPerObject._wvp, transposeWvp);
    g_pDeviceContext->UpdateSubresource(g_pConstantBufferPerObject, 0, NULL, &g_constantBufferPerObject, 0, 0);
    g_pDeviceContext->VSSetConstantBuffers(0, 1, &g_pConstantBufferPerObject);

    g_pDeviceContext->PSSetShaderResources(0, 1, &g_pCageTexture);
    g_pDeviceContext->PSSetSamplers(0, 1, &g_pCubeTextureSamplerState);

    // box
    g_pDeviceContext->DrawIndexed(36, 0, 0);

    wchar_t buffer[32];
    swprintf_s(buffer, 32, L"%.2f", g_fps._fps);

    g_pSpriteBatch->Begin();
    g_pSpriteFont->DrawString(g_pSpriteBatch, buffer, XMFLOAT2(30, 30));
    g_pSpriteBatch->End();

    // Present the backbuffer to the screen
    hr = g_pSwapChain->Present(0, 0);
//>>>> This behavior means the app crashes if you hit a DEVICE_REMOVED or DEVICE_RESET.
    if (FAILED(hr))
    {
        ErrorBoxW(L"Cannot present without error.");
    }
}

您通常可以为视口状态“设置它并忘记它”RSSetViewports这也隐式设置剪刀状态,但更好的用法是在执行初始操作时在每一帧的开头设置它Clear。这是我在中使用的模式Direct3D 游戏模板 https://github.com/walbourn/directx-vs-templates.

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

DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 使用后退/前进按钮时,将页面重定向到自定义页面,而不是默认显示“网页已过期”

    我正忙于一个只有一个页面的网站 只有登录后才能访问 home jsp 一旦用户使用有效会话登录 如果他按下浏览器上的后退按钮 那么他应该被重定向到login jsp如果他按下浏览器的前进按钮 则会再次出现 他应该无法到达home jsp所以
  • 具有自定义值类型的 map::emplace()

    我使用时遇到问题map emplace 谁能帮我找出正确的语法来使用 我实际上正在尝试做同样的事情这个例子 http www cplusplus com reference map map emplace 这是我的版本 include
  • 视图不在窗口层次结构中的 iOS

    当我从 PassCode 控制器移动到 OTP ViewController 时 我在控制台中收到以下错误 警告 尝试在 PassCodeController 0x1ec3e000 gt 其视图不在窗口层次结构中 这是我用来在视图之间更改的
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • 将多个绘图合并为 gif

    我正在尝试使用 caTools 包将多个绘图组合成一个 gif 我的基本代码如下所示 for i in 1 100 plot plots few points and lines changes slightly with each i 我
  • android 中的自定义 MediaPlayer 类

    我刚刚完成了一个项目 我使用网络视图进行视频播放 现在我被要求用自定义播放器替换 webview 部分 玩家应该能够处理 HLS 如果我使用VideoView和MediaController 我可以播放直播 但不幸的是 MediaContr
  • 选择列的一部分

    我想知道是否有人可以帮助查询以选择列的一部分 criteriadata 列包含如下所示的数据 标准数据 14 27 15 14 30 15 DD 14 38 15 通过 14 33 15 通过 如何只选择数字 15 之后出现的数据 非常感谢
  • AVAudioPlayer 在 iPhone 5 中无法工作

    我正在开发一个 iPhone 应用程序 在这个应用程序中 我使用 AVAudioPlayer 来播放音频 这是我播放声音的代码 NSString resourcePath NSBundle mainBundle resourcePath r
  • 如何为 VueJS 组件创建 v-model 修饰符?

    在VueJS中有一些v model修改预解析绑定值 例如v model trim从字符串中删除空格 如何创建自己的修改器 例如v model myparse今天嗯使用类似的东西 computed name get function retu
  • 避免在 Flutter Web 插件包之外使用纯 Web 库

    我正在构建一个 Flutter 应用程序 并尝试在网络上运行 其中一部分包含一些特定于网络的代码 import dart html as html import package flutter foundation dart class D
  • to_proc 方法在 Ruby 中意味着什么?

    我正在学习 Rails 并关注这个线程 https stackoverflow com questions 1961030 我被困住了to proc方法 我认为符号只是字符串的替代品 它们就像字符串 但在内存方面更便宜 如果我还缺少任何其他
  • 在 Cordova 中单击 html 按钮时启动新活动

    我正在尝试使用 Cordova 和 Java 构建 Android 应用程序 我想构建当在 HTML 代码中单击按钮时启动新 Intent 的意图 这是我的 HTML 代码 h2 Hello Android h2
  • Aptana Python stdlib 与 virtualenv 的问题

    我最近开始开发一个项目 仅使用 vim 作为我的文本编辑器和 virtualenv 设置 我从 GitHub 在此 virtualenv 上安装了一些 API 最终 项目变得有点大了 超出了 vim 的处理能力 所以我不得不将项目移动到 I
  • iOS 5 核心数据冻结

    我尝试做以下简单的事情 NSArray entities context executeFetchRequest inFetchRequest error fetchError 没有什么花哨 但这在 iOS 5 中冻结 在 iOS 4 中工
  • Kubeadm 加入失败:无法请求集群信息

    我有两台服务器作为本地服务器网络上的主节点和工作节点 master node 10 20 20 214 worker node 10 20 20 218 在主节点中 我成功使用 kubeadm init 设置 Calico 网络 它报告消息
  • 如何清除组合框?

    我有一些组合框设置为下拉列表 用户可以在其中选择一个数字 我还有一个清除按钮 应该清除组合框中的文本 但我似乎无法得到它 我试过了 doesn t work cboxHour Text and doesn t work cboxHour R
  • Maven 快速入门指南 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的任务是为工作中的新程序设置开发环境 领导者选择 Eclipse 作为其 OSGi 支持的 IDE 并选择 Maven 作为构建实用程序
  • 如何在 Rails 中格式化日期时间?

    在我的 Rails 视图中 我有以下显示日期时间的代码 该行的结果如下 2013 02 02 01 00 00 UTC 我该如何更改它 使其显示为 2 2 13 X 00 PST 使用红宝石的strftime 关于日期 日期时间 看一下文档
  • Kafka Streams - 如何扩展 Kafka 存储生成的变更日志主题

    我有多个冗余应用程序实例 它们想要使用主题的所有事件并独立存储它们以进行磁盘查找 通过rocksdb 为了便于论证 我们假设这些冗余消费者正在服务无状态 http 请求 因此 负载不是使用 kafka 共享的 而是使用 kafka 将数据从
  • DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

    我使用时遇到问题DirectX SpriteFont DirectX SpriteBatch 来自 DirectXTK 与此处讨论的问题完全相同 使用 SpriteFont 类绘制文本时出现问题 https stackoverflow co