有一些我从未理解过的东西.像GTA IV这样伟大的大型PC游戏如何使用50%的CPU并以60fps运行,而旋转茶壶@ 60fps的DX演示使用率高达30%?
我有一些顶点数据.位置,法线,纹理坐标.我可能从.obj文件或其他格式加载它.也许我正在画一个立方体.但是每个顶点数据都有自己的索引.我可以使用OpenGL/Direct3D渲染这个网格数据吗?
我想知道着色器内部的"If-statements"(顶点/片段/像素......)是否真的会降低着色器性能.例如:
使用它更好吗:
vec3 output;
output = input*enable + input2*(1-enable);
Run Code Online (Sandbox Code Playgroud)
而不是使用这个:
vec3 output;
if(enable == 1)
{
output = input;
}
else
{
output = input2;
}
Run Code Online (Sandbox Code Playgroud)
在另一个论坛上有一个关于那个的讨论(2013):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html 这里有人说,If语句真的很糟糕用于着色器的性能.
此外,他们还在讨论if/else语句(2012)中的内容:https: //www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)
也许硬件或着色器编译器现在更好,他们修复了这个(可能不存在)性能问题.
编辑:
在这种情况下,这里假设enable是一个统一变量,它总是设置为0:
if(enable == 1) //never happens
{
output = vec4(0,0,0,0);
}
else //always happens
{
output = calcPhong(normal, lightDir);
}
Run Code Online (Sandbox Code Playgroud)
我想在这里我们在着色器中有一个分支,它会降低着色器的速度.那是对的吗?
制作2个不同的阴影是否更有意义,比如一个用于其他阴影,另一个用于if部分?
我正在寻找一个算法或库(更好)将多边形分解为三角形.我将在Direct3D应用程序中使用这些三角形.什么是最好的选择?
这是我到目前为止所发现的:
我非常感谢有此领域经验的人的一些意见.
编辑:这是一个2D多边形.
我有一个wxWidgets应用程序,它有许多子opengl窗口.我正在使用自己的GL画布类,而不是wx类.Windows共享他们的OpenGL上下文.我不认为它是wxwidgets的事实在这里真的很重要.
opengl窗口是窗口的子窗口,它们是彼此的兄弟,包含在选项卡控件中.MDI样式界面的种类,但它不是MDI窗口..每个窗口都可以单独调整大小.除非启用Aero且DWM处于活动状态,否则一切都很可爱.
调整任何窗口(甚至不是opengl窗口)的大小会导致所有opengl窗口偶尔闪烁,其中包含一个陈旧的后备存储视图,其中包含屏幕上那个非opengl的垃圾.这仅在启用Aero时发生.
我很确定这是DWM实际上没有在其绘图表面后备存储上的opengl内容,并且窗口没有在正确的时刻重新绘制.
我已经尝试了很多东西来解决这个问题,我确实有一个解决方案,但它不是很好,并且需要将带有glReadPixels的帧缓冲区读入DIB,然后在我的onPaint例程中将其渲染到绘制DC.这种解决方法仅在DWM处于活动状态时才启用,但我根本不必这样做,因为它会稍微损害性能(但在功能强大的系统上也不会太糟糕 - 场景是相对简单的3d图形).也不推荐混合使用GDI和opengl,但这种方法令人惊讶.我现在可以忍受它,但我宁愿不必.如果我想截取子窗口的截图,我仍然需要在WM_PRINT中执行此操作,我没有看到解决方法.
有谁知道更好的解决方案吗?
在有人要求之前我肯定会做以下事情:
我试过了:
禁用DWM不是一种选择.
据我所知,如果你在OpenGL上使用Direct3D,这甚至是一个问题,虽然我没有测试过它,因为它代表了很多工作.
与窗口模式相比,Direct3D应用程序在全屏模式下的性能似乎要好得多.这背后的技术原因是什么?
我想这与全屏幕应用程序可以获得显示器的独占控制这一事实有关.但是为什么应用程序无法获得部分屏幕(即窗口)的独占控制权并具有相同的性能优势?
标准模型是OpenGL用于专业应用程序(CAD),Direct3D用于游戏.
随着openGL 3.0的崩溃,openGl仍然是技术3D应用程序(cad/GIS)的自然选择吗?
是否有Direct3D的场景图库?
(当然Direct3D只是windows.)
在我的D3D 11项目中,我总是添加
#if (defined(DEBUG) || defined(_DEBUG))
deviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif /* (defined(DEBUG) || defined(_DEBUG)) */
Run Code Online (Sandbox Code Playgroud)
到设备创建标志以启用调试输出.自从我升级到Windows 10后,这不再起作用了.设备创建失败,输出如下:
D3D11CreateDevice:指定了标志(0x2),它需要适用于Windows 10的D3D11 SDK图层,但它们不在系统中.必须删除这些标志,或者必须安装Windows 10 SDK.标志包括:D3D11_CREATE_DEVICE_DEBUG
但是,我无法使用Windows 10 SDK,也无法将项目从VS2013升级到VS 2015 atm.有没有办法解决这个问题,即我可以在Windows 10上使用VS2013启用D3D11调试层吗?
我意识到这可能是一个荒谬的问题,但在尝试找出哪些库用于哪些项目之前,我认为首先真正理解这些库的目的是有意义的.
很多视频游戏都使用像OpenGL这样的库.我在这些库中看到的所有教程都演示了如何编写告诉计算机绘制内容的代码.事实上,在游戏中,所有东西都是使用Zbrush,Maya或3ds Max等软件建模的.这些模型有纹理,很好用.看起来你需要做的就是编写一个动画循环来反复绘制模型和更新,而不是实际编写代码来绘制每一个小东西.这将非常耗时并且会使模型无用.那么OpenGL或Direct 3D在哪些方面与视频游戏和3D艺术相关?当所有图形都已创建并且只需要加载和绘制时,它们对于它们至关重要?它们主要用于着色器和效果吗?
这个问题可能只是证明我对此有多新,但这是我从未听过的问题.我刚刚开始学习编程,并且我对代码和逻辑的理解相当不错,但我根本不了解图形库或某些框架,而且教程没有帮助.
我最近一直在玩Direct3D 11并且由于缺乏关于API基础知识的文档(例如简单的几何渲染)而感到沮丧.稀疏文档带来的混淆之一是(明显的)远离着色器效果的使用.
在D3D11中,所有效果(.fx)支持已从D3DX库中删除,并被埋没在难以找到(当然稀疏文档)的共享源库中.所包含的示例都不使用它,而是直接编译HLSL文件.所有这一切都告诉我,微软正试图让人们停止使用效果文件格式.真的吗?是否有任何类型的文件说明了这一点?我很好,无论哪种方式,但多年来他们一直在推广.fx格式,所以他们突然决定放弃它似乎很奇怪.