标签: directx-10

什么是学习着色器程序的最佳工具?

我最近一直在做一些DirectX 10工作,我正在寻求转向DirectX 11和Shader Model 5.0.我过去曾写过一些非常简单的着色器,我正在寻求拓宽视野,开拓更复杂的着色器.我的问题有点多重:

  1. 什么是编程着色器的最佳工具?我只使用了visual studio和SOME FX作曲家 - 阅读:足以打开它并查看它.

  2. gfx卡的品牌是否会影响您可以编程的着色器类型?

    • 我问的原因是,似乎Nvidia有更好的工具,ATI似乎取消了RenderMonkey.我似乎没有看到任何替代品?我错了吗?
  3. 排序与#1相同的问题,但如果您打算编写DirectX着色器而非特定于供应商,是否可以使用跨供应商工具?

    • 如果您需要针对特定​​供应商,Nvidia通常会有更好的工具吗?我现在真的很喜欢ATI,因为它们似乎是最好的降压(我有一块AMD主板) - 但我犹豫不决,因为我主要使用我的gfx卡进行编程.

c++ directx shader directx-10

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

如何在DirectX 10中保存backbuffer文件?

我想使用DirectX 10逐帧渲染视频.稍后将通过mencoder或ffmpeg等其他工具处理这些帧.

我在使用DX9时没有遇到任何问题D3DXSaveSurfaceToFile.

现在,在DX10中我发现了D3DX10SaveTextureToFile,但没有运气用它来保存我的后备箱.

我使用以下代码:

ID3D10Resource *backbufferRes;
_defaultRenderTargetView->GetResource(&backbufferRes);

D3D10_TEXTURE2D_DESC texDesc;
texDesc.ArraySize = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
texDesc.Format = backbufferSurfDesc.Format;
texDesc.Height = backbufferSurfDesc.Height;
texDesc.Width = backbufferSurfDesc.Width;
texDesc.MipLevels = 1;
texDesc.MiscFlags = 0;
texDesc.SampleDesc = backbufferSurfDesc.SampleDesc;
texDesc.Usage = D3D10_USAGE_STAGING;

ID3D10Texture2D *texture;
HRESULT hr;
V( _device->CreateTexture2D(&texDesc, 0, &texture) );
_device->CopyResource(texture, backbufferRes);

V( D3DX10SaveTextureToFile(texture, D3DX10_IFF_DDS, filename) );
texture->Release();
Run Code Online (Sandbox Code Playgroud)

这会创建一个.dds图像,无法通过我所知道的任何类型的DDS视图/编辑器打开.

我的代码出了什么问题?

screenshot directx-10

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

在Direct3D(DirectX)应用程序中禁用alt-enter

我正在阅读使用DirectX 10的3D游戏编程简介来学习一些DirectX,我正在尝试进行拟议的练习(第4章为拥有该书的人).

一个练习要求使用禁用Alt + Enter功能(切换全屏模式)IDXGIFactory::MakeWindowAssociation.

然而,无论如何它都会切换全屏模式,我无法理解为什么.这是我的代码:

HR(D3D10CreateDevice(
        0,                 //default adapter
        md3dDriverType,
        0,                 // no software device
        createDeviceFlags, 
        D3D10_SDK_VERSION,
        &md3dDevice) );

IDXGIFactory *factory;
HR(CreateDXGIFactory(__uuidof(IDXGIFactory), (void **)&factory));
HR(factory->CreateSwapChain(md3dDevice, &sd, &mSwapChain));
factory->MakeWindowAssociation(mhMainWnd, DXGI_MWA_NO_ALT_ENTER);
ReleaseCOM(factory);
Run Code Online (Sandbox Code Playgroud)

c++ directx direct3d directx-10

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

DirectX 11 渲染到纹理

基本上,我正在尝试将场景渲染到纹理,就像这里的 ogl 教程一样但在 DirectX 11 中,我遇到了一些问题:

  1. 当我启动程序 IDK 时,绝对没有任何内容呈现。
  2. 纹理唯一显示“正确”的是清晰的颜色。 调试构建
  3. 我已经检查了 RenderDoc 中的可执行文件,在捕获的帧中,后台缓冲区绘制了四边形,其上的纹理正确显示了场景! 渲染文档捕获输出

源码峰:

                D3D11_TEXTURE2D_DESC texDesc;
            ZeroMemory(&texDesc, sizeof(D3D11_TEXTURE2D_DESC));

            texDesc.Width = Data.Width;
            texDesc.Height = Data.Height;
            texDesc.Format = R32G32B32A32_FLOAT;
            texDesc.Usage = D3D11_USAGE_DEFAULT;
            texDesc.SampleDesc.Count = 1;
            texDesc.SampleDesc.Quality = 0;
            texDesc.CPUAccessFlags = 0;
            texDesc.ArraySize = 1;
            texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
            texDesc.MiscFlags = 0;
            texDesc.MipLevels = 1;

            if (Data.Img_Data_Buf == NULL)
            {
                if (FAILED(DX11Context::GetDevice()->CreateTexture2D(&texDesc, NULL, &result->tex2D)))
                {
                    Log.Error("[DirectX] Texture2D Creation Failed for Null-ed Texture2D!\n");
                    return;
                }
                D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
                srvDesc.Format = texDesc.Format;
                srvDesc.ViewDimension …
Run Code Online (Sandbox Code Playgroud)

c++ directx directx-11 game-engine directx-10

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

如何在 DirectX 10 中正确更新顶点缓冲区

对于一点背景:我正在使用 C++ 开发一个项目,在该项目中我试图根据实时配置文件数据绘制对象的 3D 表示。分析数据是从外部分析硬件收集的。该系统沿着一个物体以每秒 300 次的速度为我的软件提供一个剖面切片。每个切片由约 8000 个 XY 点的列表组成。轮廓仪的运动由编码器记录。编码器信息提供扫描的第三维。

另一个需要注意的重要事项是探查器可能会在对象上来回移动。发生这种情况时,我想用新的切片替换以前读取/绘制的切片(基于编码器位置)。到目前为止,我正在使用我按编码器计数存储的切片的循环缓冲区来实现这一点。这也意味着当缓冲区填满并开始覆盖旧切片时,我会想要丢弃切片。为了在屏幕上显示适当数量的主题片断 - 我需要一次绘制 1000 个切片数据。现在我将对象渲染为点云。将来我们可能会尝试附加相邻的切片并渲染为三角形列表。

我是 DirectX 的新手,但使用书籍和在线示例,我已经达到了在 3D 中绘制对象的程度,但我确信我没有有效/正确地使用顶点缓冲区。我发现的大多数示例都适用于非常静态的模型。因此,他们倾向于用他们的点列表创建一个单一的顶点缓冲区,然后只是通过矩阵变换来操作。另一方面,当我从硬件中检索配置文件数据时,我将非常快速地更新场景。

目前,我正在为我读入的每个切片创建一个新的顶点缓冲区。当我绘制场景时,我会遍历最多 1000 个缓冲区的列表,并为每个缓冲区调用 Draw()。我注意到,如果我将一次绘制的顶点缓冲区数量减少一半,我的 FPS 会显着增加,而将每个缓冲区的顶点点数量减半时几乎没有改进 - 所以我认为这表明多个顶点缓冲区不是解决这个问题的正确方法。

所以对于我的问题的胆量......我想知道当顶点变化如此频繁时我是否可以将所有这些顶点放在一个顶点缓冲区中。我可以更新现有顶点缓冲区中的点吗?或者我应该在每次更新场景时重新创建一个全新的缓冲区?要记住的最后一件事是,硬件中每个切片的点数会有所不同 - 因此,在覆盖之前的切片时,新切片可能比被替换的切片具有更多或更少的点。

谢谢你的时间。任何建议将不胜感激!

c++ directx vertex-buffer directx-10 vertex

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

DXUT 配置

这实际上是两个问题合二为一,但都与 DXUT 相关。

  1. 如何配置项目以在 Visual Studio 2010 中使用 DXUT?我是否需要将所有头文件和源文件添加到我想要使用 DXUT 的任何项目中?我可以将 ($DXSDK_DIR)\Samples\C++\DXUT\Core 添加到我的 Include 目录中吗?

  2. 是否有 D3D10 相当于:

    DXUTSetCallbackD3D9DeviceReset( OnResetDevice ); DXUTSetCallbackD3D9DeviceLost( OnLostDevice );

如果没有,为什么?

#include <Windows.h>
#include <DXUT.h>
#include <DXUTmisc.h>

//--------------------------------------------------------------------------------------
// Reject any D3D10 devices that aren't acceptable by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK IsD3D10DeviceAcceptable( UINT Adapter, UINT Output, D3D10_DRIVER_TYPE DeviceType,
                                   DXGI_FORMAT BufferFormat, bool bWindowed, void* pUserContext )
{
return true;
}


//--------------------------------------------------------------------------------------
// Create any D3D10 resources that aren't dependant on the back buffer
//--------------------------------------------------------------------------------------
HRESULT CALLBACK …
Run Code Online (Sandbox Code Playgroud)

c++ frameworks directx-10

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

将c ++应用程序从Directx9移植到Directx10之前的重要读取

我正处于在我们的软件中启动大型重构循环的边缘.目前,渲染组件仍然基于DX9.新版本将使用DX10.

在我开始之前,是否有关于将DX9移植到DX10的重要且写得很好的指南或概述?我找到了一些小信息,但找不到任何写得好的帖子,指南或概述.我想防止自己制造"经典"错误,我可以通过阅读来防止这种错误,然后再开始移植.

我的目的是阅读"通用"移植指南以及更具体的示例.该软件既可以渲染网格也可以渲染卷,因此非常感谢有关这些主题的信息.其他关键字 - 但不仅限于 - :缓冲区,内存管理和多GPU.

c++ porting directx-10 directx-9

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

在禁用DWM的窗口模式下Direct3D 10 vsync问题

我在禁用DWM的窗口模式下在Direct3D 10上遇到vsync问题.

我们有一个应用程序,它呈现并呈现一些输出.它必须在窗口模式下工作,它必须至少产生稳定的60 fps.一个版本的应用程序使用Direct3D 9和另一个Direct3D 10.当我们在窗口模式下工作时,有时我们有fps减少(它不是"稳定"减少.大多数时候我们产生稳定的60 fps,有时它会突然减少几秒钟,然后回到60帧/秒).在两个版本的应用程序中,fps减少约为10-20 fps.这是不可接受的.

在Windows Vista和Windows 7中,有一种新的图形系统,称为"桌面组合",它改变了应用程序在屏幕上显示像素的方式.桌面组合由桌面窗口管理器(DWM)执行.您知道,当启用DWM时,应用程序将绘制到视频内存中的屏幕外表面,而不是由DWM呈现并在一段时间内显示在显示屏上.所以,我们注意到,当任务管理器中的dwm.exe没有做任何事情(处理时间约为0%)时,我们有fps减少,当dwm.exe需要1-3%的处理时间时,有稳定的60 fps,所有都是好.

我们无法影响它.因此,我们必须关闭DWM才能获得高稳定的fps.当我们关闭它时,一切都好.两个版本的应用程序都有稳定的60 fps.但是DWM在窗口模式下执行vsync,所以当我们关闭它时,我们必须自己做vsync.

但是当我们关闭DWM时,在窗口模式下Direct3D 10中的vsync存在问题.在显示器顶部有图像撕裂.Direc3D 9运行良好.

因此,我们有一个60 Hz刷新率的显示器.

在创建交换链时,我们设置了这样的参数:

swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
Run Code Online (Sandbox Code Playgroud)

在演示时我们设置了一个标志来打开vsync:

m_pSwapChain->Present( 1, 0 );
Run Code Online (Sandbox Code Playgroud)

并有下一个vsync问题.有垂直线,从左到右快速移动.并且在显示器的顶部有图像撕裂.
http://bit.ly/POQoFq

起初我们认为,我们做错了什么.所以我用旋转立方体安装了Microsoft的示例"Tutorial 07:Texture Mapping and Constant Buffers".制作更大的立方体,将其放置得更高,使其旋转得更快并得到同样的问题(见图片).
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu

所以,在全屏模式下的Direct3D 10上一切都还可以.Vsync工作得很好.在Direct3D 9上也可以,在禁用或启用DWM的情况下,vsync工作正常.在禁用DWM的窗口模式下的Direct3D 10上存在问题.

它在不同的计算机,不同的视频卡(Nvidia 8600 GT,Nvidia 9500 GT,ATI Radeon HD 5870 Eyefinity 6)和不同版本的驱动程序上进行了测试.问题稳定转载.我们正在使用Windows 7.

那么,为什么会出现这样的问题呢?如何解决它以及接下来该做什么?

UPD1.如果上面的图像不可用,则会有一些镜像.

https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313. JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG

UDP2.我还要注意,我正在使用标志WS_POPUP创建窗口以隐藏标题栏(必须隐藏它).图像撕裂出现在不同的地方.它始终位于屏幕的顶部,但它可以是20像素,并且可以是50像素.因此,在创建带有标题栏的窗口时,图像的顶部有时可能根本看不到图像撕裂.

directx dwm vsync direct3d10 directx-10

5
推荐指数
0
解决办法
1978
查看次数

实现 API 以等待 d3d10 命令完成

我正在实现一些功能,需要我实现一个 API 来等待 d3d10 完成渲染。基本上我正在尝试实现对共享纹理的同步访问,这样我就可以在 d3d10 成功呈现给后台缓冲区后更新纹理。通过调用这个黑盒 api,我认为这可以实现,我认为它类似于 glfinish()。我读过我们可以使用 ID3D10Query 查询来实现同步访问。

  D3D10_QUERY_DESC queryDesc;

  ... // Fill out queryDesc structure

  ID3D10Query * pQuery;
  pDevice->CreateQuery( &queryDesc, &pQuery );

  pQuery->Begin();

  ... // Issue graphis commands, do whatever

  pQuery->End();

  UINT64 queryData; // This data type is different depending on the query type

  while( S_OK != pQuery->GetData( &queryData, sizeof( UINT64 ), 0 ) )
  {
  }
Run Code Online (Sandbox Code Playgroud)

我应该在开始和结束之间放置一些虚拟命令吗?因为我想将此功能公开为名为 waitforgraphiscompletion 的公共 API

这里的虚拟命令应该是什么?

directx graphics direct3d directx-11 directx-10

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

在DirectX 10/11中从GPU返回转换后的顶点

我正在开发的图形引擎已经形成了一个主要的瓶颈,即顶点上的矩阵变换(几乎没有静态顶点).到目前为止,我一直在用CPU转换顶点并每帧更新顶点缓冲区(数据复制本身就是一个瓶颈,但到目前为止是可管理的).

所以我在考虑是否可以将网格缓冲区保留在GPU内部,我可以在那里转换顶点并将转换后的顶点集合返回到主内存以进行其他处理(后续处理需要比GPU着色器更多的互连性允许).这可能会消除当前代码中的瓶颈.

关于如何做到这一点的任何提示?谢谢.

c++ directx-11 directx-10 vertex vertex-shader

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