问题标签 [direct3d11]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pixel-shader - 像素着色器实际上是做什么的?
我对图形编程比较陌生,而且我刚刚阅读了一些书籍并且一直在浏览教程,所以如果这似乎是一个愚蠢的问题,请原谅我。
我已经掌握了directx11 的基础知识并开始运行,现在我想找点乐子。所以很自然地,我一直在大量阅读着色器管道,我已经着迷了。编写一段简单、微小的代码,它必须足够高效,以每 60 秒运行数万次而不浪费资源,这让我急于掌握这个概念,然后再继续下去,可能会弄得一团糟东西的。我遇到的问题是掌握像素着色器实际在做什么。
顶点着色器很容易理解,你将一个对象的顶点组织在统一的数据结构中,这些数据结构与它相关的信息,比如位置和纹理坐标,然后将每个顶点传递给着色器,通过变换矩阵从 3d 转换为 2d . 只要我理解它,我就可以弄清楚如何编码。
但我没有像素着色器。我得到的是顶点着色器的输出是像素着色器的输入。那么这不就是将多边形顶点的二维坐标交给像素着色器吗?我所理解的是像素着色器接收单个像素并对它们执行计算以确定颜色和照明等内容。但如果这是真的,那么哪些像素呢?整个屏幕还是仅位于转换后的 2d 多边形内的像素?
还是我完全误解了某些东西?
c++ - D3DX11CompileFromFile 中的第四个参数是什么?
我一直在使用 D3DX11CompileFromFile 函数从 blob 指针编译和创建 ID3D11VertexShader * 和 ID3D11PixelShader * ,如下所示:
其中 vsFilename 是一个有效的 std::string 而 m_vertexShader 是一个 ID3D11ShaderVertex *。我很好奇第四个参数是干什么用的?它在哪里使用,我什么时候使用它,它有什么作用?它是什么有关系吗?我问,因为我在代码中调用它的位置,如果它除了唯一之外没有其他目的,我不希望用户必须指定它。
c++ - 具有不同顶点输入类型的多个着色器可以使用相同的顶点缓冲区吗?
假设我有一个模型。该模型具有位置、颜色、法线和 2 个纹理坐标的数据。现在假设我有一个输入类型仅为位置和颜色的着色器。但是,此模型的顶点缓冲区格式为:
尽管这个模型中有关于获取位置和颜色的着色器的信息,但我不能使用它,因为有多余的数据。我能想到的唯一其他解决方案是拥有多个具有相同信息的顶点缓冲区减去几个字段,但这只是多余的。必须有更好的方法。这里有什么帮助吗?
编辑:我想我会在工作前的一段时间内详细说明我的问题。在谈论顶点缓冲区时,我指的是您使用 ID3D11Device::CreateBuffer 创建的 ID3D11Buffer *。在此之前,我用 Vertex_PCNT2 类型填充顶点数组。据我所知,该缓冲区现在永久采用这种格式,因此所有着色器都必须使用这种格式。当数据已经存在时,设置其他缓冲区只会对 ram 造成压力。
direct3d - 在 DXGI 中启用“实时对象警告”
在 Direct3D 11 中,我可以启用“活动对象警告”,例如
在我的调试版本中检测尚未发布的对象。
我可以为 DXGI 做同样的事情吗?如果是这样,怎么做?
performance - 当我每帧写入单个顶点缓冲区数千次时,如何提高 Direct3D 的性能?
我正在尝试编写一个 OpenGL 包装器,它允许我使用所有现有的图形代码(为 OpenGL 编写的)并将 OpenGL 调用路由到 Direct3D 等效项。到目前为止,这种方法的效果出奇的好,只是性能变成了一个相当大的问题。
现在,我承认我很可能以从未设计过的方式使用 D3D。我在每个渲染循环中更新了数千次单个顶点缓冲区。每次我绘制一个“精灵”时,我都会使用纹理坐标等向 GPU 发送 4 个顶点,当屏幕上的“精灵”数量一次达到 1k 到 1.5k 左右时,我的应用程序的 FPS 下降到低于 10 帧/秒。
使用 VS2012 性能分析(这很棒,顺便说一句),我可以看到 ID3D11DeviceContext->Draw 方法占用了大部分时间: Screenshot Here
在设置顶点缓冲区或绘制方法期间,是否有一些设置我没有正确使用?为我的所有精灵使用相同的顶点缓冲区真的非常糟糕吗?如果是这样,我还有哪些其他选项不会彻底改变我现有图形代码库的架构(围绕 OpenGL 范例构建......每帧都将所有内容发送到 GPU!)
我游戏中最大的 FPS 杀手是当我在屏幕上显示大量文本时。每个字符都是一个带纹理的四边形,每个字符都需要单独更新顶点缓冲区并单独调用 Draw。如果 D3D 或硬件不喜欢多次调用 Draw,那么你怎么能一次在屏幕上绘制大量文本呢?
如果您想查看更多代码来帮助我诊断此问题,请告诉我。
谢谢!
这是我正在运行的硬件:
- 酷睿 i7 @ 3.5GHz
- 16 GB RAM
- GeForce GTX 560 钛
这是我正在运行的软件:
- Windows 8 发布预览
- 对比 2012
- 直连 11
这是绘制方法:
这是创建顶点缓冲区的方法:
这是我的顶点着色器代码:
voxel - 具有实例化对象的场景的体素化
我在directx11 中创建了一个简单的场景,它有一个平面作为地板,有几个球体、立方体和矩形墙。只加载了 3 个对象:平面、立方体和球体;但是立方体和球体被多次实例化,具有不同的缩放、位置和旋转。其中两个对象是动态的。
考虑到具有不同比例和旋转的对象实例,我想将整个场景(100x100x20 单位)体素化为 0.2 单位体素。
我已经阅读了几篇关于体素化的文章,并获得了来自 GPU Pro 3 的“Practical Binary Surface and Solid Voxelization with Direct3D 11”的源代码;但是所有这些文章都展示了单个对象的体素化——将它们的三角形分割成一个网格。
我将如何扩展这些方法以解决具有多个对象实例的整个场景?
我唯一能想到的就是我必须对整个场景进行自上而下的八叉树划分。但对于动态场景,这会不会太贵?
对于我的场景,我为每个加载的模型使用一个缓冲区,所以如果我要在计算着色器中进行体素化,我是否需要将所有三个缓冲区复制到一个缓冲区中?我如何考虑模型实例?
谢谢你。
reflection - Metro 中的 D3D11 不支持 D3DReflect?(为什么不?)
Metro中的D3D11不支持D3DReflect
.
为什么不?
我的 API 使用它来动态获取着色器的常量缓冲区大小。
有没有其他方法可以在没有ID3D11ShaderReflection
对象的情况下在 D3D11 中动态获得恒定的缓冲区大小?还是按名称获取常量变量?
如果我想为 Metro 制作一个着色器编译工具怎么办?
什么是我想要制作一个允许您动态生成需要着色器生成的复杂画笔的艺术应用程序。但这不起作用。
Windows(Desktop)、OSX、Linux、iOS或Android是否有这些着色器限制?
不,那Metro到底为什么要这么做?
c++ - 如何以编程方式在 WinRT C++ Direct3D 应用程序中创建文本框?
我在 Windows 8 上的 VS2012 中创建了一个新项目:Visual C++ | Windows Metro 风格 | Direct3D 应用程序。
默认情况下,这会创建一个工作 D3D 应用程序,其主应用程序类Direct3DApp1
派生自Windows::ApplicationModel::Core::IFrameworkView
.
我需要以编程方式创建一个Windows::UI::Xaml::Controls::TextBox
并以某种方式将其插入到这个视图中。这在定义 XAML 的其他项目类型中似乎很容易做到,但这种 Direct3D App 项目类型没有 XAML。
如何在允许用户弹出键盘并输入文本的 Direct3D 图形上覆盖 TextBox?
扩展默认项目的完整工作 VS2012 解决方案Direct3D App
会很棒。谢谢!
textures - 在 D3D11 中创建纹理后更新纹理的 miplevel
在 Direct 3D 11 中,可以使用ID3D11DeviceContext::CreateTexture2D创建一个空纹理并使用ID3D11DeviceContext::UpdateSubresource方法更新纹理数据,指定所需的 mip 级别以在 D3D11_BOX 结构中进行更改。虽然这是可能的,但是否可以在 Direct 3D 中创建 2D 纹理后更改其 mip 级别的数量?
我知道这个问题引出了一个“你为什么要那样做?!” 响应,但由于一些移植/测试要求,我不得不这样做。
c# - SlimDX Direct3D11 中的线框
我正在尝试使用 SlimDX 渲染线框 3D 模型。
谷歌搜索后,我只找到了高级主题,而不是如何在 SlimDX 中绘制线框。他们说我必须使用着色器来做到这一点。
由于我是 DirectX 的新手,我不太了解 HLSL。
我怎么画它?如果真的需要使用着色器,谁能给我一个例子或提示?