directx和opengl哪个好?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了directx和opengl哪个好?相关的知识,希望对你有一定的参考价值。

我想自己开发一个类似于minecraft的游戏,网上查了一下资料发现opengl和directx是比较常用的,请问我开发这种游戏最好用哪种开发接口?

Opengl的稳定性要好于DirectX,但是如果你只是一般应用,不是多么复杂的程序就不用注意什么稳定性.Opengl要好学很多,但是它只有图形方面的功能,而DirectX主要是为了开发游戏而做,所以DirectX除了图形方面的功能外,还有网络,声效,输入等方面的功能.反正这两个对于我来说的最主要区别就是一个容易学一个难学. 参考技术A ①:工业用opengl,因为高端图形领域一直都是opengl独占鳌头,opengl也是事实上的工业标准。

②:opengl感觉像是c语言,而directx就像java,前者是大家一起制定标准,后者是单个公司制定标准。所以学directx能比较系统,opengl和directx入门相差不大,以后想进一步的话应该是opengl比较难。

③:好像windows7不自带opengl,当然你可以到opengl.org下载相关DLL,LIB。

④:你的系统是windows,那自然是微软自己的directx。不过,当你试了ubuntu开特效了之后,就知道opengl和directx在这些特效方面毫不落后。(ubuntu的桌面特效是基于opengl的)

⑤:与人为乐,其乐无穷。O(∩_∩)O~

最后,你应该学OpenGL。

DirectX 和 OpenGL 之间的模板选项

【中文标题】DirectX 和 OpenGL 之间的模板选项【英文标题】:Stencil Options between DirectX and OpenGL 【发布时间】:2013-10-14 16:01:51 【问题描述】:

我正在实现一个仿真层。除了模板的东西(我的阴影重叠)之外,一切都正常。

我只是想知道我做事是否合乎逻辑 - 如果我做出正确的结论/假设:

case D3DRS_STENCILENABLE:
    glAble(GL_STENCIL_TEST, value);
    break;
case D3DRS_STENCILFAIL:
    sStencilFail = glFromD3DSTENCILOP((D3DSTENCILOP)value);
    AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass));
    break;
case D3DRS_STENCILZFAIL:
    sStencilPassDepthFail = glFromD3DSTENCILOP((D3DSTENCILOP)value);
    AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass));
    break;
case D3DRS_STENCILPASS:
    sStencilPassDepthPass = glFromD3DSTENCILOP((D3DSTENCILOP)value);
    AssertGL(glStencilOp(sStencilFail, sStencilPassDepthFail, sStencilPassDepthPass));
    break;
case D3DRS_STENCILFUNC:
    sStencilFunc = glFromD3DCMPFUNC((D3DCMPFUNC)value);
    AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask));
    break;
case D3DRS_STENCILREF:
    sStencilRef = value;
    AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask));
    break;
case D3DRS_STENCILMASK:
    sStencilValueMask = value;
    AssertGL(glStencilFunc(sStencilFunc, sStencilRef, sStencilValueMask));
    break;
case D3DRS_STENCILWRITEMASK:
    AssertGL(glStencilMask(value));
    break;

以下是上面使用的。 glAble() 只是 glEnable/glDisable 的包装器。

static GLenum glFromD3DCMPFUNC(D3DCMPFUNC value) 
    return(GL_NEVER + value - 1);


static GLenum glFromD3DSTENCILOP(D3DSTENCILOP value) 
    switch (value) 
    case D3DSTENCILOP_KEEP: return(GL_KEEP);
    case D3DSTENCILOP_ZERO: return(GL_ZERO);
    case D3DSTENCILOP_REPLACE: return(GL_REPLACE);
    case D3DSTENCILOP_INVERT: return(GL_INVERT);
    case D3DSTENCILOP_INCRSAT:
    case D3DSTENCILOP_INCR:
        return(GL_INCR);
    case D3DSTENCILOP_DECRSAT:
    case D3DSTENCILOP_DECR:
        return(GL_DECR);
    default: Assert(!"Unsupported!"); return(0);
    

【问题讨论】:

您的目标是哪个版本的 D3D 和 GL?在 2.0 之前的 GL 版本中,您可能无法实现 D3D9 模板,后者仅通过扩展公开双面模板操作。我希望在您的模拟器中看到处理D3DRS_Two_Sided_StencilMODE 的东西,然后适当地将D3DRS_CCW_STENCILFAIL 之类的东西分派到glStencilFuncSeparate (...)。它增加了相当多的复杂性,但是有一些常见的用例可以不同地处理前/后模板测试。 DirectX 8 - 不做双面。 OpenGL 3. 【参考方案1】:

有几件事可能会出错。

您对incr 和incr_sat 执行相同的操作。测试代码是否使用它? GL 需要扩展才能饱和。这不是一回事。 使用旧的 d3d 代码仔细检查模板 ref 是否为 0..255。处理参数 >255 或 仔细检查 d3d 是否在两侧进行。请记住,剔除是翻转的。 还要仔细检查模板清除代码!

好消息是,这应该适用于基本的表格转换。没有基本的 API 问题(我以前做过)。它只需要大量测试,因为参数空间很大。

【讨论】:

我的代码没有使用饱和度。而且我的值是 0 或 1(所以这不是钳位问题)。我有 D3D 不做双面,而且剔除是不同的 - 我看到阴影,但它们是重叠的。模板肯定是被清除了,如果没有,一开始就不会有阴影。还有什么我需要注意的吗?【参考方案2】:

想通了,我忘了设置我的 PIXELFORMATDESCRIPTOR:

pfd.cStencilBits = 8;

【讨论】:

以上是关于directx和opengl哪个好?的主要内容,如果未能解决你的问题,请参考以下文章

Google地球的“OpenGL”模式与“DirectX模式”有什么区别?

qt 3d 和opengl哪个好

检查是不是支持 DirectX 或 OpenGL

支持 Opengl 3.0+ 和 DirectX 10+ 的主要功能和窗口

OpenGL与Directx的区别

初学DirectX,怎么在Delphi中安装DirectX