- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 DirectX::SpriteFont
/DirectX::SpriteBatch
时遇到问题(来自 DirectXTK;与此处讨论的问题完全相同: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
和 SpriteBatch::End()
,您将看到一个在空间中旋转的纹理立方体(笼子)。通过调用所描述的函数,您只会在左上角看到每秒的帧数,而看不到旋转的立方体。
我遵循了 github DirectXTK 上 Chuck Walbourn 的教程,并结合了使用 SpriteFont
绘制字符串和渲染原始 3D 对象(一个简单的三角形)的 2 个教程。在这个例子中,我将看到测试字符串绘制在三角形上。但是我不明白为什么在使用 DirectXTK 的 SpriteFont
类绘制文本字符串时我的示例中的旋转立方体不可见,我什至找不到根本原因。
像素着色器文件 (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 Community Edition。我在我的项目中添加了 DirectXTK (.lib) 和 DirectXTex (WICTextureLoader
.cpp/.h, DDSTextureLoader
.cpp/.h, .lib)。立方体的图像是带有 alpha 的 .png。
注意:我创建了这个重复的问题,以
avoid ... Asking for help, clarification, or responding to other answers.
关于另一个问题。
最佳答案
首先,由于您使用的是 DirectXTK,因此不需要 DirectXTex。 DirectXTex 用于纹理处理工具,而 DirectXTK 纹理加载器更适合在应用程序中使用。参见 this blog post .
其次,不要使用古老的timeGetTime
函数。您可以使用 GetTickCount
,尽管 GetTickCount64
更好,因为它避免了溢出问题。然而,对于帧定时,这些还不够精确。你应该看看 StepTimer.h用于 DirectX Tool Kit教程。
第三,您应该考虑使用 Microsoft::WRL::ComPtr
而不是所有的 SAFE_RELEASE
宏。参见 this page了解详情。
Your code was including
xinput.h
as well. You should take a look at using DirectX Tool Kit's GamePad instead which has a number of benefits. If nothing else, it uses XInput more robustly than you likely would.
综上所述,您的问题很简单:您在 InitScene
中为您的场景设置了渲染状态,但是绘制任何东西 else 改变状态,这正是 SpriteBatch
所做的。我记录了 DirectX 工具包中每个对象在 wiki 上操作的渲染状态.
你需要设置你的 Draw 需要每一帧的所有状态,而不是假设它永远设置,如果你做不止一次绘制。
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.");
}
}
对于视口(viewport)状态 RSSetViewports
,您通常可以“设置它并忘记它”,它也隐式设置剪刀状态,但更好的用法是在您这样做时在每一帧的开头设置它您的初始 Clear
。这是我在 Direct3D Game Templates 中使用的模式.
关于c++ - DirectX::SpriteFont/SpriteBatch 阻止绘制 3D 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558178/
如何创建包含来自多个区域的字符并由 XNA 内容管道正确解释的位图字体图像? 我想在我的位图字体图像中添加一些特殊字符,但我不知道如何正确执行。 更新:我想我越来越接近我的答案了。 Sprite 字体
我正在尝试将箭头键 ►、◄、▲、▼ 添加到我的 spritefont。它们是 Alt16、Alt17、Alt30、Alt31。 这是我正在尝试做的事情。
我正在尝试在 Monogame 程序中绘制文本。我想使用 SpriteFont 来执行此操作,但在尝试加载 SpriteFont 时出现以下错误。 //Here I try to load the S
我正在使用 SpriteFont/SpriteBatch 类将文本渲染到我的游戏中,因为坦率地说,我厌倦了使用 Direct2D 和 DirectWrite...但是每次我使用 SpriteFont
当我绘制 SpriteFont 中不支持的字符时,出现异常。 TextboxString 是使用软键盘输入的字符串。玩家可以在我的 iOS/Android 应用程序中使用软键盘输入他的显示名称、密码和
我正在使用 C++ 编程并使用 DirectXTK 附带的 SpriteFont 工具。我在我的类中这样声明了一个变量: std::unique_ptr m_SpriteFont; 我是这样初始化的:
font = Content.Load("TopBarFont"); 无论出于何种原因,无论发生什么,或者我做了什么更改,我总是会收到此错误。 An unhandled exception of ty
我试过 XNA 内容编译器,但它只是吐出一个错误: There was an error while deserializing intermediate XML. String must be ex
我一直在努力让 spritefonts 在我正在从 Android 移植到 monogame 的 IOS 的游戏中工作。一切都完全一样,除了 spritefonts 似乎没有复制到调试设备。除了字体问
我在 XNA 上闲逛,我已经到了需要加载字体的部分。很简单吧? Font1 = Content.Load("Arial"); 是我用来加载字体的代码。 Arial
所以我已经进入了我正在处理的基于 2D XNA 的自上而下的 hack-and-slash 项目的一部分,我需要在屏幕上绘制文本。我想要使用的是我发现的 SpriteSheet 式图像,其中包含我
我们在 iOS 上的 MonoGame 中将纯 Arial spritefont 作为 XNB 加载时遇到问题。我使用最新的开发分支尝试了这个。这些是在 Windows 上制作的,然后在 Xamari
我在使用 DirectX::SpriteFont/DirectX::SpriteBatch 时遇到问题(来自 DirectXTK;与此处讨论的问题完全相同:Problems when drawing
我是一名优秀的程序员,十分优秀!