Questions tagged «directx»

DirectX是Microsoft提供的一组多媒体API,主要针对游戏开发人员。DirectX集合中的流行API包括Direct3D,XInput和XAudio。

3
用AA渲染线的最快方法,DirectX中的线宽变化
因此,我正在做一些DirectX开发,确切地说是在.NET下使用SharpDX(但DirectX / C ++ API解决方案适用)。我正在寻找使用DirectX在正交投影中渲染线的最快方法(例如,模拟科学应用程序的2D线图)。 我尝试渲染的各种情节的屏幕截图如下: 这类绘图具有数百万个线段,可变厚度,是否带有每行抗锯齿(或全屏AA开/关)的情况并不少见。我需要非常频繁地更新线条的顶点(例如20次/秒),并尽可能多地卸载GPU。 到目前为止,我已经尝试过: 软件渲染(例如GDI +)的性能实际上并不差,但显然在CPU上很沉重 Direct2D API-比GDI慢,尤其是在启用抗锯齿功能时 Direct3D10使用此方法在CPU端使用顶点颜色和细分来模拟AA。也很慢(我分析了它,花费了80%的时间用于计算顶点位置) 对于第三种方法,我使用“顶点缓冲区”将三角带发送到GPU,并每200毫秒用新顶点更新一次。100,000个线段的刷新率约为5FPS。我理想地需要数百万! 现在,我在想最快的方法是在GPU上进行细分,例如在Geometry Shader中。我可以将顶点作为线列表发送,也可以打包成纹理,然后在“几何着色器”中解包以创建四边形。或者,只需将原始点发送到像素着色器,然后在像素着色器中完全实现Bresenham Line绘图。我的HLSL是2006年的生锈着色器模型2,所以我不了解现代GPU可以完成的疯狂工作。 所以问题是:-有人做过吗,您有什么建议可以尝试吗?-您对通过快速更新几何来提高性能有什么建议(例如,每20毫秒创建一个新的顶点列表)? 1月21日更新 从那以后,我已经使用LineStrip和Dynamic Vertex Buffers使用Geometry Shader实现了上述方法(3)。现在我以100k点获得100FPS,以1,000,000点获得10FPS。这是一个巨大的改进,但是现在我的填充率和计算能力受到限制,因此我开始考虑其他技术/想法。 线段几何的硬件实例化如何? Sprite Batch呢? 其他面向(像素着色器)的方法呢? 我可以有效地淘汰GPU或CPU吗? 您的意见和建议深表感谢!
14 2d  directx  shaders 

5
避免在DirectX 10着色器中使用if语句?
我听说应该在着色器中避免if语句,因为语句的两个部分都将被执行,并且错误的语句将被丢弃(这会损害性能)。 在DirectX 10中仍然存在问题吗?有人告诉我,只有正确的分支才能执行。 对于该示例,我有以下代码: float y1 = 5; float y2 = 6; float b1 = 2; float b2 = 3; if(x>0.5){ x = 10 * y1 + b1; }else{ x = 10 * y2 + b2; } 还有其他方法可以使其更快吗? 如果是这样,该怎么办? 两个分支看起来都相似,唯一的区别是“常量”的值(y1, y2, b1, b2对于Pixel Shader中的所有像素都是相同的)。

2
是否可以构造少于24个顶点的立方体
我有一个像Minecraft这样的基于多维数据集的世界,我想知道是否有一种方法可以构造一个少于24个顶点的多维数据集,从而减少内存使用量。 在我看来,这是不可能的,原因有两个:法线无法正确显示,每面纹理也无法使用。 是这种情况还是我错了?也许有些新颖的DX11技术可以提供帮助? 编辑:为了明确起见,我有2个要求:我需要每个立方体面的表面法线以进行适当的照明,并且需要一种方法来解决每个立方体面的纹理数组中的不同索引

5
我应该学习Direct3D 9、10或11吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我刚刚开始使用Direct3D进行3D编程。我应该选择哪个版本的D3D? 11看起来很整洁,但9和10看起来仍然很漂亮。考虑到游戏开发行业的当前状况,开始使用哪个版本更有意义?
14 directx 

4
DirectX目前有哪些书籍(专注于3D)?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 对于OpenGL,Op​​enGL SuperBible 5th Edition才刚刚发布了几个月,它不仅是学习OpenGL 3(本书的第1部分),而且还是Parts中高级OpenGL主题的一本非常受好评的极好的书。 2和3。 对于DirectX,我们应该阅读的最新材料是什么?欢迎提供带有教程的书籍和网站。是否有可用的现代书籍通过DirectX的当前版本,供那些对C ++相当了解但完全没有DirectX经验的入门读者使用? 这似乎受到了高度赞扬:DirectX 10 3D游戏编程简介
14 c++  directx 

1
进行平面反射时要考虑波浪
我一直在研究SDK中Nvidia的示例,尤其是Island11项目,并且我发现了一些对HLSL代码感到好奇的东西,该代码根据波高的状态上下校正反射。 自然地,在检查了简短的代码段之后: // calculating correction that shifts reflection up/down according to water wave Y position float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix); float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix); waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y); 我的第一个猜测是,当它受到垂直扰动(波浪)时,它会补偿平面反射,将反射的几何图形移动到一个什么都没有的位置,而水只是像没有东西或只有天空一样被渲染: 现在,那是天空在反射,我们应该看到该地形的绿色/灰色/黄色反射与水线基线相关的地方。我的问题是,现在我无法真正查明其背后的逻辑是什么。投影波浪/水几何图形的一个点的实际世界空间位置,然后乘以-.5f,仅进行同一点的另一个投影,这一次其y坐标更改为-0.8(为什么是-0.8?)。 代码中的线索似乎表明它是通过反复试验得出的,因为存在冗余。例如,作者采用投影的y坐标的负一半(在w除后): float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; 然后对第二点做同样的事情(我想只是为了肯定,为了得到某种区别),并将它们结合起来: waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; 通过除以2,我看不出质量改善方面有什么区别(如果有人愿意纠正我,请这样做)。问题的症结似乎是预计y的差异,为什么呢?这种冗余以及-.8f和-0.15f的任意选择使我得出结论,这可能是启发式/猜测式工作的组合。是否有逻辑上的依据,或者只是绝望的破解? 这是代码段修复的初始问题的夸张,在最低细分级别上观察到。希望这可能会引发一个我想念的想法。-.8f可能是一个参考高度,从中可以推断出多少扰动纹理坐标以采样平面反射的几何体渲染,而-.15f可能是下限,这是一种安全措施。

2
在XNA中设置效果参数的最佳做法
我想问一下是否有Effect在XNA中设置参数的最佳实践。换句话说,当我打电话时到底发生了什么pass.Apply()。我可以想象多种情况: 每次Apply调用时,所有效果参数都会传送到GPU,因此我对参数的设置频率没有真正的影响。 每次Apply调用时,仅传输已重置的参数。因此,应避免缓存实际上未设置新值的Set-operations。 每次Apply调用时,仅传送更改的参数。因此,缓存Set-operations是没有用的。 这整个问题是没有根源的,因为没有一种提及的方式会对游戏性能产生任何显着影响。 因此,最后一个问题是:实现set操作的某些缓存是否有用,例如: private Matrix _world; public Matrix World { get{ return _world; } set { if (value == world) return; _effect.Parameters["xWorld"].SetValue(value); _world = value; } } 感谢你在期待。
13 xna  directx  effect 


1
有关渲染,批处理,图形卡,性能等的信息+ XNA?
我知道标题有点模糊,但是很难描述我真正想要的东西,但是这里有。 当涉及到CPU渲染时,性能通常很容易估计和直接,但是当涉及到GPU时,由于缺乏技术背景信息,我一无所知。我正在使用XNA,所以如果理论可以与之相关将非常好。 所以我真正想知道的是,当您执行特定的绘制动作时,何时何地(CPU / GPU)会发生什么?什么是批次?效果,预测等有什么影响?数据是否保留在图形卡上或是否在每个步骤中传输?当谈论带宽时,您是在谈论图形卡的内部带宽,还是从CPU到GPU的管道? 注意:我实际上并不是在寻找有关绘制过程如何进行的信息,这是GPU的业务,我对在此之前的所有开销都感兴趣。 我想了解执行动作X时发生了什么,以适应我的体系结构和实践。 非常感谢任何文章(可能带有代码示例),信息,链接,教程,它们提供了有关如何编写更好的游戏的更多见解。谢谢 :)

3
我应该如何安装第一人称相机?
我是一名初学者程序员,正在创建一个项目,该项目使我可以通过第一人称相机在房间中走动。到目前为止,我已经绘制了建筑物并继续进行,但现在我受困了,不知道如何制作第一人称视角的相机让我走来走去。 谁能指出我可以使用的相机类别或一些有用的代码?
12 c++  directx  camera 

6
有人在Delphi中写游戏吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我是一位经验丰富的Delphi开发人员(超过12年的经验不算我的Turbo Pascal经验),并且想知道是否有人在Delphi中编写游戏?我已经在Delphi中看到DirectX API包装器,该包装器允许您针对DirectX进行编程(甚至与朋友一起编写了一个简单的单人纸牌游戏),但是却没有发现有什么可以表明我应该跟上Delphi的。我只是讨厌离开这么多知识和Object Pascal语言,但是我并没有看到继续使用Delphi的理由。 我目前使用C#编程并考虑XNA,但在我看来,主要的观点是DirectX成为C / C ++路线。 还有其他的Delphi开发人员也为此感到困扰吗? 谢谢,MDV
12 directx  platform 

8
2d Game Dev(C ++)入门:DirectX还是OpenGL?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 因此,我是一名学生,希望进入游戏开发的大门,而我却希望做2D事情,也许是俄罗斯方块/太空入侵者/带有小鼠标互动克隆的东西。 我将搜索指向C ++和2d,最终导致了DirectX / OpenGL 现在,据我所知,所有这些软件包对我来说都是在屏幕上绘制东西。这就是我现在真正关心的全部。声音不是必需的。输入可能可以用stdlib处理。 因此,对于尝试使用C ++创建基本游戏的初学者,您会推荐DirectX还是OpenGL?为什么?两者之间有哪些主要功能差异?哪个更有用?
12 c++  opengl  directx 

5
API不可知的桥梁(即OpenGL / D3D /任何)。您是否使用它们,如何制作它们。专业人士和骗子[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 您正在制作3D引擎。您想要最好的多平台世界。突然您意识到,如果要在Windows机器上使用Direct3D,在OSX / Linux上使用OpenGL,则必须牺牲这两个最小公分母的支持功能。 有些人可能会在三个OS上使用OpenGL,因为它本身似乎是最小公分母。一切都很好。然后,您必须将图形API后端移植到Nintendo的GX,还必须创建PS3和Xbox360路径。 你是做什么?您是否设计自己的API(本身是最不常见的),并为每个平台编写后端实现,还是为每个平台编写自己的分支? 如果您选择设计自己的API,是使用网桥模式还是自己的伏都教?疯狂在哪里停止,您意识到一切都停止了,厨房水槽方法也必须停止,并且基本上每个平台都有一个单独的引擎作为分支。或者,您坚持一切和厨房水槽,并在每个平台的后端模块专业化中保留平台特定信息。

1
什么是屏幕空间导数?何时使用它们?
我偶尔看到着色器代码中出现了ddx和ddyglsl函数以及hlsl等效项。我目前正在使用它们来进行不切线或不切线的凹凸贴图,但是我基本上是复制粘贴了代码。我不了解这些功能的实际含义,作用以及何时使用它们。 所以问题: 屏幕空间派生函数是什么? 这些功能做什么?输入值和输出值 它们最常用于什么效果? 什么样的效果需要您关注这些功能?

2
在单独的线程中更新和渲染
我正在创建一个简单的2D游戏引擎,我想在不同的线程中更新和渲染精灵,以了解其完成方式。 我需要同步更新线程和渲染线程。当前,我使用两个原子标志。工作流程如下所示: Thread 1 -------------------------- Thread 2 Update obj ------------------------ wait for swap Create queue ---------------------- render the queue Wait for render ------------------- notify render done Swap render queues ---------------- notify swap done 在此设置中,我将渲染线程的FPS限制为更新线程的FPS。此外,我sleep()经常将渲染和更新线程的FPS限制为60,因此这两个等待函数不会等待太多时间。 问题是: 平均CPU使用率约为0.1%。有时,在四核PC中,它会上升25%。这意味着一个线程正在等待另一个线程,因为wait函数是一个带有test and set函数的while循环,而while循环将使用您的所有CPU资源。 我的第一个问题是:是否有另一种方式同步两个线程?我注意到std::mutex::lock在等待锁定资源时不要使用CPU,因此它不是while循环。它是如何工作的?我无法使用,std::mutex因为我需要将它们锁定在一个线程中并在另一个线程中解锁。 另一个问题是;由于该程序始终以60 FPS的速度运行,为什么有时它的CPU使用率会跃升到25%,这意味着两个等待中的一个正在等待很多?(两个线程都限制为60fps,因此理想情况下它们不需要太多同步)。 编辑:感谢所有答复。首先,我想说的是,我不会在每个帧开始渲染新线程。我从一开始就开始了update和render循环。我认为多线程可以节省一些时间:我具有以下功能:FastAlg()和Alg()。Alg()既是我的Update obj又是render obj,而Fastalg()是我的“发送渲染队列到” renderer”“。在一个线程中: Alg() //update FastAgl() Alg() //render …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.