标签: directx-11

DirectX11:从计算着色器读取模板位

我正在将全屏效果转换为计算着色器,以便我可以利用片段着色器无法完成的一些计算功能。现在,这种全屏效果使用模板来避免写入它不应该影响的像素,我想用我的计算着色器来模仿这种行为。

我知道我可以将此信息写入某处的颜色通道,但我希望避免这种情况,而是直接在计算着色器中读取模板位。但是,我找不到任何方法将 D24S8 缓冲区绑定到计算着色器,以便我可以实际读取模板位。它似乎只提供深度信息。

有什么办法可以做到这一点吗?谷歌让我失望了,因为在谈论采样深度值时每个人都将其称为深度/模板缓冲区。

graphics directx-11 compute-shader

2
推荐指数
1
解决办法
5034
查看次数

如何在使用 Cmake 构建期间编译 HLSL 着色器?

我正在开发 d3d 应用程序,我想在使用 cmake 构建期间编译我的 .hlsl 着色器。我不知道从哪里开始。

这是我当前的 CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(Direct3DTut)

set(CMAKE_CXX_STANDARD 17)

add_executable(${PROJECT_NAME} WIN32
                WinMain.cpp Window.cpp MessageHandler.cpp Graphics.cpp
                Keyboard.cpp Mouse.cpp
                Utils.cpp)

set(LIBS d3d11 D3DCompiler)
target_link_libraries(${PROJECT_NAME} ${LIBS})
Run Code Online (Sandbox Code Playgroud)

directx shader cmake hlsl directx-11

2
推荐指数
1
解决办法
2530
查看次数

我可以使用C#开发DirectX应用程序吗?

我想知道我是否可以使用C#使用DirectX开发图形应用程序?

directx directx-11

1
推荐指数
1
解决办法
939
查看次数

无法创建Direct2D DXGI Surface

我叫这个方法:

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

呼叫失败了E_NOINTERFACE.文档对于为什么会发生这种情况特别无益.我启用了所有DirectX 11调试的东西,这是我得到的最好的.我知道我有一个有效的IDXGISurface1*(也尝试过IDXGISurface),其他参数设置正确.关于为什么这个电话会失败的任何想法?

编辑:

我也在创建D3D11设备时遇到问题.如果我将nullptr作为D3D11CreateDeviceAndSwapChain中的IDXGIAdapter*参数传递,它可以正常工作,但是如果我自己枚举适配器并传入一个指针(唯一返回的),它将失败并带有无效参数.MSDN文档明确说明如果传递nullptr,则系统使用EnumAdapters1的第一个返回.我正在运行DX11系统.

directx-11 direct2d c++11

1
推荐指数
1
解决办法
3757
查看次数

如何正确使用XMVECTOR成员变量

我有一个简单的IRenderable类,它包含位置,缩放和旋转的成员:

XMFLOAT3 _position;
XMFLOAT3 _scaling;
XMVECTOR _rotation;
Run Code Online (Sandbox Code Playgroud)

我试图用构造函数设置它们.这里的第一种方法给出了一个访问冲突0x00000000尝试设置_rotation(_position和_scaling都设置正常):

IRenderable() : _position(XMFLOAT3(0, 0, 0)), _scaling(XMFLOAT3(1, 1, 1)), _rotation(XMQuaternionIdentity()) { }
Run Code Online (Sandbox Code Playgroud)

将_rotation改为XMVECTOR*并在构造函数中使用_rotation(new XMVECTOR())将其设置为空的XMVECTOR,但稍后在尝试设置身份Quaternion时抛出访问冲突:

*_rotation = XMQuaternionIdentity();
Run Code Online (Sandbox Code Playgroud)

在构造函数中使用XMQuaternionIdentity的地址在创建对象时工作正常,

IRenderable() : _position(new XMFLOAT3(0, 0, 0)), _scaling(new XMFLOAT3(1, 1, 1)), _rotation(&XMQuaternionIdentity()) { }
Run Code Online (Sandbox Code Playgroud)

但是,当它需要用于渲染时,四元数本身包含垃圾数据._position和_scaling在所有这些情况下都能正常工作.

在这种情况下使用XMVECTOR 的正确方法是什么?

c++ directx-11 xna-math-library

1
推荐指数
1
解决办法
1万
查看次数

RenderTargetView到ShaderResourceView

我来自XNA,在那里我可以轻松创建一个rendertarget并将其用作简单的"Texture2D".我创建了一个ID3D11RenderTargetView对象和一个ID3D11ShaderResourceView对象.我将我的精灵绘制到渲染目标,然后将其用作ShaderResourceView将其发送到着色器.

我尝试查询rendertarget的界面,如:

ID3D11ShaderResourceView *resource= NULL;
renderTargetobject->QueryInterface<ID3D11ShaderResourceView >(&resource);
Run Code Online (Sandbox Code Playgroud)

上面的代码没有为"资源"对象生成任何可用的值,我想每帧发送到我的着色器(我试图做一个简单的反射).

directx resources shader directx-11 rendertarget

1
推荐指数
1
解决办法
2783
查看次数

访问IDWriteTextFormat而不是创建新的(FW1FontWrapper行间距)

FW1FontWrapper在我的DirectX 11 C++应用程序中使用库来包装字体.

我想在渲染的文本中更改行间距(两行文本之间的距离)FW1FontWrapper.

我知道在DirectX中我可以使用它IDWriteTextFormat::SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, 30.0f, 20.0f).

不幸的是,我不知道如何访问正确的IDWriteTextFormat结构.

我试过:

HRESULT hResult = FW1CreateFactory(FW1_VERSION, &FW1Factory);
hResult = FW1Factory->CreateFontWrapper(device, L"Arial", &fontWrapper);

//my attemp - first get the IDWriteFactory
IDWriteFactory *pDWriteFactory;
hResult = fontWrapper->GetDWriteFactory(&pDWriteFactory);

//and now the IDWriteTextFormat 
IDWriteTextFormat *pTextFormat;
hResult = pDWriteFactory->CreateTextFormat(L"Arial", NULL, 
    DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, 
    DWRITE_FONT_STRETCH_NORMAL, 10.0f, L"", &pTextFormat);
pTextFormat->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, 100.f, 20.0f);
Run Code Online (Sandbox Code Playgroud)

我想它不起作用,因为这样我创建和修改新的 IDWriteTextFormat,而不是通过以下方式影响渲染:

fontWrapper->DrawString(
   context,
   s2ws(content).c_str(),// String
   fontSize,// Font size
   startTextPosition.getX(),// X position
   startTextPosition.getY(),// Y position
   color,// Text color, 0xAaBbGgRr
   FW1_RESTORESTATE// …
Run Code Online (Sandbox Code Playgroud)

c++ directx reference directx-11

1
推荐指数
1
解决办法
1187
查看次数

HLSL cbuffer,制服,尺寸和偏移量

常量缓冲区,在顶点着色器源中声明

cbuffer c_buffer : register(b0)
{
    matrix <float, 4, 4> u_mvpMatrix;
    matrix <float, 4, 4> m44;
    matrix <float, 3, 3> m33;
    matrix <float, 2, 3> m23;
    matrix <float, 3, 2> m32;
    matrix <float, 1, 3> m13;
}
Run Code Online (Sandbox Code Playgroud)

用于编译着色器的命令

fxc /nologo /E main /T vs_4_0_level_9_3 /Fh vertex_bytes.h /Vn bytes
Run Code Online (Sandbox Code Playgroud)

最后,生成的vetex_output.h中的注释

// Buffer Definitions: 
//
// cbuffer c_buffer
// {
//
//   float4x4 u_mvpMatrix;              // Offset:    0 Size:    64
//   float4x4 m44;                      // Offset:   64 Size:    64 [unused]
//   float3x3 m33;                      // …
Run Code Online (Sandbox Code Playgroud)

directx buffer hlsl directx-11 offset

1
推荐指数
1
解决办法
2397
查看次数

如何在版本之间进行迁移?

从directx 10到11有什么变化?我已经在directx 10中编写了一些代码,我想将其更改为directx 11.这仅仅是关于质量而我只能通过更改headrs和dll文件或函数以及编码方式来改变它吗?ING.

directx directx-11 directx-10

1
推荐指数
1
解决办法
429
查看次数

无法找出DirectX11的着色器?

所以,我不知道如何使用着色器.编码它们很容易,但实际上没有使用它们.MSDN对我来说真的没用,这意味着他们有最糟糕的教程.我正在阅读Frank Luna的Direct3d 11书,我终于到了实际绘制内容的部分.令人兴奋的,除了它不起作用的事实.他的BoxDemo - 我确信3年前制作这本书的时候已经工作了,但是现在有了所有新的DirectX东西 - 省略了DirectX SDK,现在使用"Windows SDK",FX被弃用,不再有D3DX库......太令人沮丧了.我继续并降级到DirectX 2010 SDK - 只是这样我才能真正使用教程.几乎每个D3D教程都使用D3DX库.

无论如何......现在回答我的问题.Visual Studio可以选择生成.hlsl文件.但是,它还具有make .fx文件的能力(如果你只是在它创建.fx文件的文件名末尾键入.fx).因此,我可以使用弃用的.fx方法,并学习如何轻松地使用它来教授它 - 或者我可以学习新的 HLSL方法,并且在没有教程的情况下学习它是最艰难,最令人沮丧的.

我知道他们都使用HLSL语言.但它们在程序中的使用方式不同.(CreateEffectFromMemory,CompileFromFile等).我有点希望学习新方法,但如果我不这样做就好了.虽然,我几乎有一个使用.fx文件的整个程序.我相信它会起作用,但我只需要帮助构建和利用"Effects11.lib".

对于拖动帖子很抱歉 - 事实上,我确信我暂时不会得到任何回复 - 如果我确实得到任何回复 - 由于长度.我非常沮丧,因为学习DirectX让我的编程生涯在过去的一个月,2个月内处于大规模的中断状态.请,谢谢你的帮助

c++ windows directx-11 direct3d11

1
推荐指数
1
解决办法
1618
查看次数