例如,在以下代码中:
ID3D11Texture2D* texture2d;
HRESULT result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*) &texture2d);//mSwapChain is a swap chain, as obvious
result = mDevice->CreateRenderTargetView(texture2d, 0, &mTargetView);
texture2d->Release();
Run Code Online (Sandbox Code Playgroud)
我真的很困惑在调用 release 之后交换链中的后台缓冲区会发生什么。目前我认为可能发生的是,指针被释放,而不会影响后台缓冲区本身。不过,我需要一个更详细的答案,因为我很难理解这个概念。
我试图在输入汇编器设置为三角形条带的情况下创建这个2D三角形:
1.(0.0f, 0.0f, 0.5f)
2.(-0.5f, 0.0f, 0.5f)
3.(-0.5f, -0.5f, 0.5f)
Run Code Online (Sandbox Code Playgroud)
但是,没有绘制三角形,实际上渲染目标上没有绘制任何内容,甚至没有绘制单行.我搞砸周围,然后我换坐标2
和3
,和它的工作.正如我想要的那样绘制三角形.这种奇怪行为的原因是什么?
我正在尝试将用户生成的Texture2D保存到磁盘,但是在定位DirectX11.1/Win8.1/Metro时看起来无法实现此标准的标准方法.没有ToStream/FromStream,也没有用于将纹理写入磁盘的DX11方法.
任何想法或建议?
如何更改 DirectX 11 中的屏幕分辨率?有没有一种简单的方法可以做到这一点,或者我是否必须完全重新创建交换链,并创建一个新的后缓冲区和渲染目标视图?
当我的窗口发生变化时,我正在努力调整缓冲区的大小。除了这一部分之外,该过程的每个部分都按预期工作。
// in MyGame.h -
private:
ComPtr<ID3D11RenderTargetView> gRenderTarget;
...
// handle resize method:
void MyGame::UpdateBackbufferSize(UINT pWidth, UINT pHeight) {
/* 1. Clear render targets from device context */
gDeviceContext->OMSetRenderTargets(0, 0, 0);
/* 2. Release Rendering Target */
gRenderTarget->Release(); // ! CANNOT ACCESS client.h private Release()
/* 3. Resize buffer */
gSwapchain->ResizeBuffers(
0,
pWidth,
pHeight,
DXGI_FORMAT_UNKNOWN,
0
);
/* 4. Reset the buffer as target view */
ComPtr<ID3D11Texture2D> backBuffer;
gSwapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), &backBuffer);
gDevice->CreateRenderTargetView(backBuffer.Get(), nullptr, &gRenderTarget);
backBuffer.Get()->Release();
/* 5. Set the new …
Run Code Online (Sandbox Code Playgroud) DirectX::SpriteFont
我在使用/时遇到问题DirectX::SpriteBatch
(来自 DirectXTK;与此处讨论的问题完全相同:Problems while 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); …
Run Code Online (Sandbox Code Playgroud) 我仍在使用我自己的自定义游戏引擎开发我的科幻视频游戏.现在,我想在我的游戏和引擎中实现战斗系统.虽然几乎所有东西都很清楚,但我想知道如何制作合适的激光束,如星球大战,星际迷航,巴比伦5等等.
我做了一些在线研究,但是我找不到合适的文章.我很确定我搜索了错误的关键字/标签.你能给我一些提示如何实现激光束等效果吗?我想,了解我在线研究所需的正确技术或术语就足够了......
我阅读了D3D11用法页面并来自CUDA背景我想知道标记为D3D11_USAGE_STAGING
存储的纹理会是什么样的内存.
我想在CUDA中它会固定页面锁定的零拷贝内存.我测量了从ID3D11Texture2D
with D3D11_USAGE_STAGING
到分配的主机缓冲区的传输时间,malloc
花了将近7毫秒(在流媒体/游戏中相当多),我认为这将是从GPU全局内存到内存区域所需的时间.
我的任何假设都是正确的吗?什么D3D11_USAGE_STAGING
用作GPU内存?
我试图做一个DirectX教程,但我想用C编写应用程序,而不是用C++编写.所以我用C编写代码,但是当我尝试编译它时,我在"setupD3D"函数中遇到了很多错误.所以我只是将文件重命名为.cpp.但新代码也没有编译.我认为结合C和C++是个问题,或者有许多交叉引用.谁能告诉我这段代码中的问题是什么?
direct3d.h:
#include "main.h"
#ifndef DIRECT3D
#define DIRECT3D
int m_videoCardMemory;
char m_videoCardDescription[128];
ID3D11DeviceContext* m_deviceContext = 0;
D3DXMATRIX m_projectionMatrix;
D3DXMATRIX m_worldMatrix;
D3DXMATRIX m_orthoMatrix;
int setupD3D(BYTE vsync, HWND hwnd, float screenDepth, float screenNear);
void terminateD3D();
void beginScene(float red, float green, float blue, float alpha);
void endScene();
#endif
Run Code Online (Sandbox Code Playgroud)
direct3d.cpp
#include "direct3d.h"
// code
Run Code Online (Sandbox Code Playgroud)
main.h:
#ifndef MAIN_FUNC
#define MAIN_FUNC
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib")
#pragma comment(lib, "d3dx10.lib")
#include <Windows.h>
#include <dxgi.h>
#include <d3dcommon.h>
#include <d3d11.h>
#include <d3dx10math.h>
#include "direct3d.h"
int …
Run Code Online (Sandbox Code Playgroud) 我正在编写基于DirectX 11的引擎.所有DirectX Com对象都包装在Microsoft :: WRL :: ComPtr中.但不幸的是,当我在关机时调用ID3D11Debug :: ReportLiveDeviceObjects时,它报告的多于1个对象的引用计数非零.
我很困惑,哪些代码实际上增加了那些引用计数,防止引用最后为零.举个例子,我在我的代码中提供了ID3D11ShaderResourceView的这个示例用法:
ID3D11ShaderResourceView在我的渲染目标类中声明为成员,
Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_pShaderResourceView
Run Code Online (Sandbox Code Playgroud)
它在构造函数中初始化为nullptr:
m_pShaderResourceView(wwNULLPTR)
Run Code Online (Sandbox Code Playgroud)
界面创建如下:
device->CreateShaderResourceView(m_pDXTexture.Get(), &shaderResourceDesc, m_pShaderResourceView.ReleaseAndGetAddressOf());
Run Code Online (Sandbox Code Playgroud)
该接口用于GenerateMips函数:
deviceContext->GenerateMips(m_pShaderResourceView.Get());
Run Code Online (Sandbox Code Playgroud)
接口有一个getter函数:
ID3D11ShaderResourceView* GetShaderResourceView()
{
return m_pShaderResourceView.Get();
}
Run Code Online (Sandbox Code Playgroud)
最后在析构函数中重置了接口:
m_pShaderResourceView.Reset();
Run Code Online (Sandbox Code Playgroud)
最后,我在实时对象摘要中获得至少8个引用.
我的问题是:
我的代码的哪一部分实际上增加了引用计数?为什么调用Reset不会使引用为零?可能我错过了什么?
谢谢.
directx-11 ×10
directx ×6
c++ ×3
3d ×1
c ×1
c# ×1
com ×1
direct3d11 ×1
directx-10 ×1
gpu ×1
hlsl ×1
resize ×1
sharpdx ×1
spritefont ×1
uwp ×1
winapi ×1
windows ×1
windows-8.1 ×1