Articles of directx9

有效的方法来绘制多个分离的四边形

假设我想在Direct3D 9中绘制几个分离的(可能是纹理的)四边形,每个都由两个三角形组成: 我应该如何绘制这些图片以获得最佳性能,即以下哪种方式在速度方面更好? 由4个顶点描述每个四元组,使用D3DPT_TRIANGLESTRIP并为每个四元组调用IDirect3DDevice9::DrawPrimitive ,因为它们没有连接。 用6个顶点描述每个四边形,使用D3DPT_TRIANGLELIST并调用IDirect3DDevice9::DrawPrimitive一次。 第一种方法使用较less的内存,而第二种方法只需要一个绘制调用。 然而,第二种方法似乎是可行的,只有当所有四边形具有相同的纹理时,否则将需要开关。

WDDM管理D3DPOOL_DEFAULT中的内存

在这个问题中,我看到我在DX9EX的D3DPOOL_DEFAULT中内存不足。 将我的用法从D3DUSAGE_DYNAMIC为0 (静态用法)后,所有内容都运行良好,没有DX9错误。 在我的加载过程中,我以前会得到DX9的内存不足错误,现在我看到系统内存开始增长。 所以我认为WDDM正在管理我的纹理。 所以我的问题是,我真的在这里看到了内存管理吗? 我在复制和访问资源数据(Direct3D 10)中阅读了有关WDDM的内容,但我不确定是否属于DX9EX。 维基百科说: WDDM驱动程序允许video存储器进行虚拟化,并将video数据从video存储器分页到系统RAM中。

HLSL着色器(效果)中的SetFloat()不起作用 – variables停留在0

我有一个问题,我想在我的着色器中设置两个简单的浮点variables。 我在这个项目中有十几个其他着色器,但是由于某种原因,我在这个项目中有一个我不能发现的bug。 这是我正在做的事情。 为了简洁起见,我会对其进行编辑,但请尽量保持完整。 任何建议都非常欢迎! 首先,将video的宽度和高度存储在表示着色器的类中,然后调用设置variables的函数。 _hVideoWidth = _ptrEffect->GetParameterByName(0, "videoWidth"); _hVideoHeight = _ptrEffect->GetParameterByName(0, "videoHeight"); pShader->_videoWidth = pCameraManager->_backBufferWidth; pShader->_videoHeight = pCameraManager->_backBufferHeight; pShader->SetActive(); _ptrEffect->SetFloat(_hVideoWidth, _videoWidth); _ptrEffect->SetFloat(_hVideoHeight, _videoHeight); 然后我做我的绘画: UINT cPasses; pShader->GetEffect()->Begin(&cPasses, 0); // Drawing code here pShader->GetEffect()->End(); 我的着色器将使用videoHeight / Width来缩放到视口。 如果我硬编码的宽度和高度,这一切都完美的作品。 cbuffer VideoData : register(b0) { float videoWidth; float videoHeight; } VertexShaderOutput UILineVertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; […]

什么是DirectX 11相当于DirectX 9的D3DCAPS9 :: MaxVertexIndex?

我正在将DirectX 9程序移植到DirectX 11.如何获取使用的DirectX 11中的值 D3DCAPS9::MaxVertexIndex 在DirectX 9中? 提前致谢。

如何使用SlimDX将Direct3D9全屏?

我在写一个由SlimDX包装的Direct3D9应用程序。 我试图把我的应用程序全屏,但我有问题。 我可以重置设备,使其覆盖整个屏幕,但是,似乎设备窗口失去焦点。 光标属于设备窗口下面的窗口。 当我点击屏幕(在全屏模式下)时,设备窗口下方的窗口变得焦点。 这不应该发生。 在我管理设备的c#代码中,我已经将DXUT(从DirectX SDK)转换为c#…有很多代码可以覆盖,但我希望得到一个理论上的答案。 当我全屏显示应用程序时,设备上发生了什么? 为什么当设备窗口继续渲染并覆盖屏幕时,设备窗口下面的窗口变得焦点? 我的问题可能与Windows Forms使用GDI绘制有关吗? 我在这里find一个post,描述了一个结果不同的问题,但可能与原因相同。

为什么从D3D9切换到D3D11后,图片失真?

我已将应用程序从Directx9移至Directx11。 升级之后,奇怪的事情发生在我的世界。 物体变得歪斜,变成了2D,也被夹在意想不到的地方。 我附上的图像上的两个箭头指向我的HUD参考框架 – 三个很好的圆锥体,排列在三个轴上,应该显示在窗口的左下角。 你也可以看到球体被夹在不同的位置,所有的物体都是二维的。 有侧面和前面的看法。 感谢您的建议。 需要指出的是球体正在移动。 我使用XMMatrixPerspectiveFovLH来获得投影matrix。 matrix示例: World 2 0 0 0 0 10 0 0 0 0 1 0 0 0 10 1 View – Identity Proj 1.72 0 0 0 0 2.41 0 0 0 0 1. 1. 0 0 -1. 0 之前的图像都是错误的渲染。 只是侧视图和从错误的渲染视图。 感谢蒂尔我得到这个: 这一个几乎是正确的,只有一些问题在锥体中形成参考框架。 编辑:问题得到了答复,但没有人想把他的评论作为一个asnwer。 首先是 […]

如何用DirectX 9绘制椭圆?

我可以绘制一个椭圆的轮廓,但我想画一个填充的椭圆,但我似乎无法得到的代码工作。 任何帮助将是伟大的! 我正在使用DirectX 9和D3DX。

如何在Direct3D 9中手动同步渲染调用和显示器的刷新率?

我有一个应用程序,利用Direct3D 9渲染3Dgraphics。 我试图手动控制在给定的秒内呈现的帧的数量。 这里是伪代码: while( bInGame ) { // handle window stuff dispatchEvents(); // handle d3d9 stuff if( !windowMessages ) { // process animation OnD3D9FrameMove(GetElapsedTime()); // when work is done render a frame (30 frames per second) while(GetElapsedTime() < 0.03333333f){ Thread.Sleep(1); } } } 上面的代码是非常粗糙的,但解释了我想要做的。 我想让帧之间的时间来处理工作(即可见性,animation等)。 除了一个问题,实际的代码运行良好。 由于渲染帧与屏幕的刷新率不同步而出现屏幕exception。 这种exception最好被描述为横向撕裂,这是一个不理想的结果。 当我使用此代码激活vsync时,不会出现屏幕exception。 然而,我不能使用vsync,因为它阻止了我的游戏循环继续,直到渲染帧,从而消耗了我想要留出的空闲时间。 我怎样才能解决这个问题? 我想用我的应用程序而不是Direct3D API与监视器同步。 这样我可以控制工作stream程…任何想法?

用解锁的D3DFORMAT抓取深度缓冲区

我目前在一个mod框架(Multitheft Auto)上掏腰包,试图读取D3DFMT_D24S8(DirectX9)中的深度缓冲区。 如果将格式更改为D3DFMT_D32F_LOCKABLE,然后lockingrectange,则可以读取它,但会导致渲染模糊,如下所示: 我目前开放hacky方法,如find指向缓冲区的指针,并读取深度没有正确locking和/或使用CUDA。 任何意见将非常感激。 谢谢!

D3D9 – (像素?)着色器将数据从纹理复制到纹理

我想将格式为INTZ的D3D9深度/模板纹理(1024 * 1024)的内容复制到系统内存。 据我所知(和我的尝试已经表明),我不能locking这个纹理由于其使用types(深度/模具)。 现在我想使用(像素?)着色器将所有数据从这个INTZ纹理复制到第二个纹理相同的大小,但格式为R32F ,我应该能够在此之后调用GetRenderTargetData ,从而将内容复制到第三个纹理驻留在SYSTEMMEM池中。 我想这足以将INTZ纹理映射到一个被拉入R32F纹理的四边形。 问题1 :我的方法可行吗? 我是对的,我可以使用SetTexture绑定INTZ纹理,在像素着色器中对其内容进行采样,并将值作为COLOR写入R32F纹理(此时设置为渲染目标)? 我相当肯定只是通过纹理坐标是不够的,特别是因为如果在我的顶点着色器中没有定义POSITION语义,我得到HLSL编译器错误。 Q2a :如果位置真的有必要的话,我必须给顶点分配哪些位置值(我知道我必须扩展顶点的定义)。 0 | 0,0 | 1023,1023 | 0,1023 | 1023? Q2b :在其他地方我已经读过,有一个FVF代码D3DFVF_XYZRHW ,它应该防止这些转换应用于位置值。 那将是必要的,对吗? Q3 :我甚至可以完全跳过顶点着色器(即设置NULL着色器)吗? 我已经看到了一些关于像素或者顶点着色器被设置为空的效果的例子,所以我认为这必须是可能的。 我到目前为止是以下… 顶点着色器: struct VS_IN { // without specifying following POSITION anywhere compilation fails float4 pos : POSITION; float2 texcoord : TEXCOORD0; }; struct VS_OUT { […]