我想使用两个浮点数进行双重划分(看起来Direct Compute不支持双重划分).
那可能吗?
这是我到目前为止所尝试的(c#代码,以后应该是HLSL):
int count = 7;
double value = 0.0073812398871474;
float f1 = (float)value;
float f2 = (float)((value - f1));
float r1 = f1 / count;
float r2 = f2 / count;
double result = (double)r1 + (double)r2;
Run Code Online (Sandbox Code Playgroud)
0,00105446285765182(结果)
0,00105446284102106(正确的结果)
它与f1中的舍入有关.如果值是:
double value = 0.0073812344471474;
Run Code Online (Sandbox Code Playgroud)
然后结果是正确的.
当我运行我的3D场景时,它只渲染第一帧然后在它和黑屏之间翻转,导致大量闪烁.我认为这是我的交换链没有正确设置,但我真的不知道.
这是我的代码来设置它.它几乎是从微软的例子中复制而来的.
DXGI_SWAP_CHAIN_DESC1 sd = {0};
sd.Width = 0;
sd.Height = 0;
sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.Stereo = false;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 2;
sd.Scaling = DXGI_SCALING_NONE;
sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
sd.Flags = 0;
CoreWindow^ window = reinterpret_cast<CoreWindow^>(mSystem->GetIWindow());
hr = pIDXGIFactory->CreateSwapChainForCoreWindow(mD3DDevice, reinterpret_cast<IUnknown*>(window), &sd, NULL, &mSwapChain);
EA_ASSERT(SUCCEEDED( hr ));
Run Code Online (Sandbox Code Playgroud)
而目前的代码:
DXGI_PRESENT_PARAMETERS presentParameters = {0};
HRESULT hr = mSwapChain->Present1(0, 0, &presentParameters);
Run Code Online (Sandbox Code Playgroud)
在我看来相当直接,所以我不明白为什么它不起作用.
场景一直在运行.更新功能每帧都运行一次.
另外,如果我在PIX中检查渲染,一切都很好.我得到了我期望渲染的东西.它只是没有出现在屏幕上.
有任何想法吗?谢谢!
那么如何使用IASetVertexBuffers
方法更新绑定到设备对象的顶点缓冲区中的值?也将在此缓冲区变化值调用之前Draw()
和Present()
?还会根据缓冲区中的这些新值更新图像吗?
我正在使用DirectX 11处理卷渲染程序.
我渲染到窗口(HWND
)和纹理(ID3D11Texture2D
).
虽然HWND
总是看起来正确的渲染,但ID3D11Texture2D
对于小于64x64的渲染大小,我看起来很糟糕:
我想知道DirectX 11中是否存在纹理的最小大小限制.
不幸的是,我只能找到有关最大纹理大小限制的信息.
我有一个带有以下代码的头文件:
Microsoft::WRL:ComPtr<ID3D11Device2> m_device;
Run Code Online (Sandbox Code Playgroud)
在类定义中。Visual Studio 2013表示Microsoft不是名称空间,如果我将代码剪切并切下,然后将其放在另一个文件的另一个类中,则保持不变就可以了!
有任何想法吗?
菲利浦
编辑:突然之间(无需我进行任何更改)Intelissense现在接受Microsoft :: WRL :: ComPtry为有效,但是在我编译时它仍然给我错误,提示它不存在。
我正在尝试将 DirectX11/XAML UWP 模板移植到 C++-WinRT 版本...其中一切都是通过 C++-WinRT 完成的,我可以关闭 CX。
我目前陷入了如何ResizeBuffers
使用交换链的困境。我不断收到错误消息,提示我尚未释放所有缓冲区引用。如果我注释掉与调整缓冲区大小有关的任何内容并仅硬编码大小,则该应用程序可以正常工作。所以...我可能做错了什么。
我相信这与新的winrt::com_ptr
. 没有Reset
像 WRL ComPtr 上那样的方法。我已将它们设置为nullptr
与原始 C++/CX 模板中一样,但这似乎还不够。
我必须做的其他事情可能会影响正在发生的事情:
DeviceResources 类现在是一个 C++/WinRT 类,我使用 nullptr_t 参数在所有其他类(SampleScene3DRenderer、DirectXPage 和 Main)中默认创建该类。这样,我可以在 DirectXPage 中创建它,传入 swapChainPanel 引用,然后将这个 DeviceResources 实例传递给我创建的所有其他类。
在 DirectX 初始化中有一个地方您必须传入**IUnknown
. C++/WinRT 的文档提到使用调用的函数winrt::get_unknown
来返回*IUnknown
. 我无法让它适用于以下DWriteCreateFactory
方法,所以我尝试了这种方式:
DX::ThrowIfFailed(
DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory3),
reinterpret_cast<::IUnknown**>(m_dwriteFactory.put())
)
);
Run Code Online (Sandbox Code Playgroud)我不知道还能做什么。只有交换链调整大小不起作用。我是在 PC 上(不是 Windows Phone)执行此操作。
我目前正在开发我的第一个 D3D 项目,其中涉及为游戏创建叠加层,以便向用户呈现实时信息。实际的数据采集已经处理完毕,将通过消息系统发送。目前,我的程序适用于无边框全屏模式,并且正在调整它以在窗口模式下按比例缩放(以确保所有内容都指向正确的位置,无论大小如何)。该应用程序是游戏的父级,但是,当游戏进入真正的全屏模式时,一切都会崩溃。研究表明,据我了解,我需要创建一个假的 .dll,并将其插入到游戏的本地目录中。该 .dll 将被打开,而不是它正在寻找的实际 directX DLL,我可以在那里制作所需的图形。
为了回答一些潜在的问题,我无法直接访问游戏,而且,虽然相关游戏的开发者已经同意这一点,但我宁愿它不要被反作弊软件捕获和惩罚。此外,我希望将性能影响保持在最低限度,因此目前覆盖层的 FPS 相当低(~10fps)。
预先感谢您的任何帮助!
我正在使用C++在Visual Studio 2017中创建DirectX11应用程序,我需要在我的"GeometryGenerator.h"头文件中声明一个数据结构.
问题是当我尝试使用类型:我的头文件中的XMFLOAT3时,当我尝试运行项目时,我从Visual Studio收到错误并给我这样的消息:
“C4430: missing type specifier - int assumed”
Run Code Online (Sandbox Code Playgroud)
在我声明XMFLOAT3类型的变量的行中
这是我的代码:
#pragma once
#include "..\Common\DeviceResources.h"
#include "ShaderStructures.h"
#include "..\Common\StepTimer.h"
namespace DirectX11Engine
{
class GeometryGenerator {
public:
struct Vertex
{
Vertex() {}
Vertex(const XMFLOAT3& p, const XMFLOAT3& n, const XMFLOAT3& t, const XMFLOAT2& uv)
: Position(p), Normal(n), TangentU(t), TexC(uv) {}
Vertex(
float px, float py, float pz,
float nx, float ny, float nz,
float tx, float ty, float tz,
float u, float v)
: Position(px, py, pz), Normal(nx, …
Run Code Online (Sandbox Code Playgroud)