编辑:当然,在工作了一个小时后立即发布在这里,我发现了愚蠢的错误......
我在尝试#include <d3dx9.h>
项目时遇到了编译器错误.我收到"致命错误C1083:无法打开包含文件:'d3dx9.h':没有这样的文件或目录".
$(DXSDK_DIR)Include;$(IncludePath)
"和" $(DXSDK_DIR)Lib\x86;$(LibraryPath)
",并且环境变量%DXSDK_DIR%
指向C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
预期的.$(DXSDK_DIR)include
在附加包含目录中列出d3dx9d.lib
包含在Debug中,d3dx9.lib
包含在Release配置中.d3dx9.h
并建议文件中的类型和函数名称(并且不包含在我正在#include
处理的任何其他内容中),因此Intellisense似乎可以找到它.关于我忘记什么或者还有什么可以尝试的任何建议?
谢谢
我已经为C#天搜索和测试不同类型的渲染库了好几周了.到目前为止,我还没有找到一个适用于多窗口渲染设置的单个库.要求是能够在12+监视器设置(财务图表)上运行程序,而无需在快速计算机上进行延迟.每个窗口需要每秒更新多次.虽然执行此CPU需要执行大量密集和时间关键任务,因此必须将一些负担转移到GPU.这就是硬件渲染的步骤,换句话说就是DirectX或OpenGL.
我已经尝试过使用Windows窗体的GDI +,并认为它对我的需求来说太慢了.我已经通过OpenTK(在Windows窗体控件上)尝试了OpenGL,它看起来相当快(我还有一些测试可以在它上面运行)但是很难正常工作(很难找到/编写好的文本渲染库).最近我通过SharpDX尝试了DirectX9,DirectX10和Direct2D以及Windows窗体.我为每个窗口尝试了一个单独的设备,并且单个设备/多个交换链接近.所有这些都导致多个窗口的性能非常差.例如,如果我将目标FPS设置为20并在不同的监视器上打开4个全屏窗口,则整个操作系统开始严重滞后.渲染只是将屏幕清除为黑色,不渲染基元.此测试的CPU使用率约为0%,GPU使用率约为10%,我不知道 了解这里的瓶颈是什么?我的开发计算机非常快,i7 2700k,AMD HD7900,16GB内存因此测试肯定应该在这个上运行.
相比之下,我在C++/Win32 API一个设备/多个交换链上做了一些DirectX9测试,我可以打开遍布4个监视器工作区的100个窗口(上面有3D茶壶旋转),并且仍然拥有完全负责的操作系统(fps是当然在渲染窗口上掉落到5左右,这是我期望运行100个同时渲染的东西).
有谁知道在C#上进行多窗口渲染的任何好方法,还是我被迫用C++重新编写我的程序来获得性能(主要的痛苦)?我想在进入C++路线之前,我正在给OpenGL另一个镜头.我会在这里报告任何发现.
试验方法参考:
对于C#DirectX单设备多交换链测试,我使用了这个优秀答案的方法: 每台显示器显示不同的图像directX 10
Direct3D10版本:
我创建了d3d10device和DXGIFactory,如下所示:
D3DDev = new SharpDX.Direct3D10.Device(SharpDX.Direct3D10.DriverType.Hardware,
SharpDX.Direct3D10.DeviceCreationFlags.None);
DXGIFac = new SharpDX.DXGI.Factory();
Run Code Online (Sandbox Code Playgroud)
然后像这样初始化渲染窗口:
var scd = new SwapChainDescription();
scd.BufferCount = 1;
scd.ModeDescription = new ModeDescription(control.Width, control.Height,
new Rational(60, 1), Format.R8G8B8A8_UNorm);
scd.IsWindowed = true;
scd.OutputHandle = control.Handle;
scd.SampleDescription = new SampleDescription(1, 0);
scd.SwapEffect = SwapEffect.Discard;
scd.Usage = Usage.RenderTargetOutput;
SC = new SwapChain(Parent.DXGIFac, Parent.D3DDev, scd);
var backBuffer = Texture2D.FromSwapChain<Texture2D>(SC, 0);
_rt = new RenderTargetView(Parent.D3DDev, backBuffer);
Run Code Online (Sandbox Code Playgroud)
在每次渲染迭代时执行的绘图命令很简单:
Parent.D3DDev.ClearRenderTargetView(_rt, new Color4(0, 0, …
Run Code Online (Sandbox Code Playgroud) 当内存接近 2GB 时,我们遇到了旧的闭源游戏引擎无法编译着色器的问题。
问题通常与D3DXCreateEffect
. 通常它会返回 HResult“内存不足”,有时会d3dx9_25.dll
在弹出窗口中打印随机错误,或者它只是完全的段错误。
我相信问题在于缺乏大地址意识:我注意到其中一个d3dx9_25.dll
崩溃做了一些暗示这样的事情。它需要一个看起来像 的有效指针0x8xxxxxx3
,检查位0x80000003
是否点亮,如果是,则位反转指针并取消引用它。结果指针指向未分配的内存。在编译前强制引擎 malloc 2GB 会使着色器每次都无法编译。
不幸的是,我们对 DX9 的了解非常有限,我已经看到 DX9 有一个标志,D3DXCONSTTABLE_LARGEADDRESSAWARE
但我不确定它到底应该去哪里。我能找到的游戏使用的唯一 API 调用依赖于它D3DXGetShaderConstantTable
,但问题发生在它被调用之前。注射标志(1 << 17) = 0x20000
,以D3DXCreateEffect
使着色器以另一种方式失败编译。
是D3DXCreateEffect
应该接受较大的地址标志?我发现了一个使用它的wine 测试,但深入研究 DX9 程序集,它抛出的错误是由内部函数FFFFF800
在设置了in 标志中的任何位时返回 HResult Invalid Call 引起的,这让我相信CreateEffect
不应该接受这个标志.
在此之前还有其他地方我应该注入大地址感知标志吗?我知道D3DXGetShaderConstantTable
需要修复对使用的调用D3DXGetShaderConstantTableEx
,但它甚至还没有达到。
我知道有关于这个问题的几个主题,但我想说明我在寻找什么.
所以我学习了OpenGL并获得了着色器(可编程管道),顶点缓冲区,索引缓冲区的基础知识,所有这些都被称为"现代OpenGL".
如果DirectX存在这样的术语,我感兴趣.
关于哪个DirectX版本可供选择,有几种意见.9几乎可以在所有Windows PC上运行,而11仅限于较新的GPU和Windows Vista +.
我的GPU支持9,而我的操作系统支持11.我应该选择软件加速11还是硬件加速9?
DirectX9是不是被弃用的OpenGL?因此,如果我学习DirectX9而不是11,那是浪费时间还是可用?换一种说法.DirectX9是否提供现代OpenGL提供的功能?
如果是这样,我应该使用哪些来源(教程/书籍/视频)来获得在DirectX中使用着色器,缓冲区等的基本技能?例如,在一个教程中我找到了这一行:d3dDevice-> BeginScene(); 它让我想起了弃用的OpenGL.我不想学习尖端的DirectX,但我想在兼容性和现代概念之间做一个很好的交易.
在另一个帖子中,我发现了这本书:http: //www.amazon.com/dp/1598220160/?tag = stackoverfl08-20
但是,如果我把时间浪费在被弃用的旧东西上,我有点害怕.
总而言之,我需要一些帮助,我真的无法想象一下走哪条路.
我希望你能得到我的观点.
如何使用C/C++中的D3D9使用stb_truetype库呈现文本?我在各种论坛/网站和图书馆的文档中查看了d3d9中的一些示例,但我没有找到任何示例.
我正在尝试编写一个非常简单的着色器,它可以为适用的对象添加随机闪烁.我想这样做的方法是在像素着色器中为像素值添加一个白色的随机阴影(R = G = B).
它似乎noise()
不像我希望的那样工作:
float multiplier = noise(float3(Input.Position[0], Input.Position[1], time));
Run Code Online (Sandbox Code Playgroud)
它给我"错误X4532:无法将表达式映射到像素着色器指令集",指的是调用noise()
.
由于我不知道在着色器调用之间保留数字的方法,我认为我不能只根据渲染前传入的种子编写一个简单的随机数生成函数.
有没有办法从像素着色器内部生成一个随机数?如果有办法,怎么样?
好的,所以我试图在Direct X游戏上为一些额外的按钮做一些叠加.
我在这里找到了一个很好的覆盖的c ++示例:http://www.gamedev.net/topic/359794-c-direct3d-hooking-sample/
所以我开始将它转换为Delphi.通过一些日志记录,我可以看到它在正确的进程上启动钩子并正确挂钩Direct3DCreate9().
下一步成功创建TMyDirect3D9.但是这个过程从这里崩溃了.
我的有根据的猜测(基于Ollydbg中的一些调试)当我通过挂钩的Direct3DCreate9()将MyDirect3D9返回到原始进程并且它尝试调用其中一个类(接口)函数时,它失败了.
代码如下.如果我能提供任何其他信息以帮助告诉我.
主DLL:
library LeagueUtilityBox;
{$R *.res}
{$DEFINE DEBUG}
uses
Windows,
APIHijack in 'APIHijack.pas',
Direct3D9 in '..\DirectX 9.0\Direct3D9.pas',
uSharedMem in '..\Misc\uSharedMem.pas',
MyDirect3D9 in 'MyDirect3D9.pas',
MyDirect3DDevice9 in 'MyDirect3DDevice9.pas',
{$IFDEF DEBUG}
SysUtils,
uLog in '..\Misc\uLog.pas',
{$ENDIF}
uMisc in 'uMisc.pas';
var
SharedMem : TSharedMem;
D3DHook: SDLLHook;
hHook : DWORD;
MyDirect3D9 : TMyDirect3D9;
function GetTargetProcess: String;
const
KeyBase : DWORD = HKEY_CURRENT_USER;
KeyLocation : String = 'Software\LeagueUtilityBox';
var
RegKey : HKEY;
TargetProcess : Array[0..511] Of …
Run Code Online (Sandbox Code Playgroud) 我创建了简单,独立于帧,可变时间步长,Direct3D9
使用中的线性运动ID3DXSprite
.大多数用户都无法注意到它,但在某些(包括我的)计算机上,它经常发生,有时它会很多口吃.
VSync
启用和禁用会发生口吃.
我发现在OpenGL
渲染器中也会发生同样的情况.
它不是浮点问题.
似乎问题只存在于AERO Transparent Glass
窗口模式中(在全屏,无边界全屏窗口或禁用航空器时很好或至少不那么明显),当窗口失去焦点时甚至更糟.
编辑:
即使发生口吃,帧增量时间也不会留出16 ... 17 ms的界限.
好像我的帧增量时间测量日志代码被窃听了.我现在修好了.
(我只在应用程序出口处转储一次日志,而不是在运行,渲染时,因此它不会影响性能)
device->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 0);
device->BeginScene();
sprite->Begin(D3DXSPRITE_ALPHABLEND);
QueryPerformanceCounter(&counter);
float time = counter.QuadPart / (float) frequency.QuadPart;
float deltaTime = time - currentTime;
currentTime = time;
position.x += velocity * deltaTime;
if (position.x > 640)
velocity = -250;
else if (position.x < 0)
velocity = 250;
position.x = (int) position.x;
sprite->Draw(texture, 0, 0, &position, …
Run Code Online (Sandbox Code Playgroud) 在:C++\Win32应用程序(不是全屏)\ DX9
如何在调整大小期间快速重新绘制窗口内容并且足够好?调整大小==用户拖动窗口边框.
不同的方法:
Present(,,,)
每个WM_SIZE和\或WM_PAINT乍一看都排除了这种情况.在第二个.也许我不明白重要的事情?所以,当最后一个方法失败时,我决定在这里问.是否有可能使dx9表面牢固地粘在窗口边框上.没有黑色条纹.喜欢减慢缩放速度,但以某种方式与DX同步.
我在 form1 构造函数中有一段代码:
ConvertedBmp = ConvertTo24(newest.FullName);
Run Code Online (Sandbox Code Playgroud)
函数 ConvertTo24 是:
private static Bitmap ConvertTo24(string inputFileName)
{
sw = Stopwatch.StartNew();
Bitmap bmpIn = (Bitmap)Bitmap.FromFile(inputFileName);
Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(converted))
{
g.PageUnit = GraphicsUnit.Pixel;
g.DrawImageUnscaled(bmpIn, 0, 0);
}
sw.Stop();
return converted;
}
Run Code Online (Sandbox Code Playgroud)
问题是我如何在这一行中使用 ConvertedBmp:
backTexture = TextureLoader.FromFile(D3Ddev, @"D:\test.bmp");
Run Code Online (Sandbox Code Playgroud)
TextureLoader 有一些属性,其中两个是:Fromfile,它获取设备和字符串,或者 FromStream,它获取设备和流。
我已经有了设备对象,但是如何将 ConvertedBmp(位图类型)与 TextureLoader 一起使用?