Group Details Private

网站运营团队

这是一群默默守护我们家园的人,我们对你们的默默付出表示致以敬意!

  • USD在Maya中通过Hydra来进行渲染

    1.jpg

    简介

    USD全称是“Universal Scene Description”,它主要着力的是电影、游戏复杂制作的流程的规范化。这回我们主要来研究USD在Maya中有关渲染部分究竟是如何实现的。

    USD通过附属的子项目Hydra来实现在其工具“UsdView”以及Maya中渲染方面的实现。Hydra是一款经过多年锤炼的渲染引擎(据说自从2012年就开始研发),Hydra与Maya中有关渲染的结合得益于Maya支持第三方渲染框架通过它提出的“Viewport (1.0、2.0)”方式支持。

    初探

    我们打开USD项目,会发现它有很多子项目。其中包含了imaging和usd子项目。这里我们主要关注的是imaging项目。由单词意思可知,其主要关注的是产出图片的,也就是有关渲染的。
    ca7ce8ff-7e7d-4ec3-9246-fbee48109c7b-image.png

    有关Hydra是三个子项目。包含了hdSt、hdStream以及hdx。我们主要关注的是hdSt。因为这个项目是和OpenGL渲染密切相关的。由于OpenGL是做渲染的大家通用知识,因而它是我们关注的主要子项目。

    调试

    调试.jpg
    我们调试这部分代码,截了此图。我们在图中至少发现几个问题:

    1. Maya底层是用OpenSceneGraph(OSG)管理场景的。我们可以看到Maya 2018的文件夹里有很多OSG开头的动态链接库,这么说具体视口渲染的部分都是建立在OSG上的。Maya的Viewport 2.0也是建立在OSG上的。在可见的将来它们不会替换掉OSG。

    2. USD的Hydra和Maya结合的类叫做UsdMayaGLBatchRenderer。由名字可知,它仅工作在OpenGL下,换句话说,如果Maya使用的是DirectX11进行渲染的,那么它将会失效。
      d7063ec4-242e-40bd-bf05-5103c38fedf1-image.png

    3. libhd项目只是一个前端库,后端通过libhdx以及libhdSt来实现。尤其是libhdSt,它主要是和OpenGL打交道的。它十分复杂。主要基于的是OpenGL 3.3+,也就是包含了各种着色器以及高级栅格化技术,并且整合了网格细分库:OpenSubdiv。

    后续

    由于我们的研究方向是思考一个方式来让让Hydra支持过程化纹理,因此我们还需要继续对此进行研究。

    posted in 技术博客区
  • 制作浏览Maya内置图标小工具,用来获取Maya内置图标

    最近我开始在Maya工作啦。Maya是一款优秀的三维软件,可以处理布景、建模、纹理、装备、渲染等操作。而且它可以支持C++和Python的开发。文档也是非常多的(参考这里)。

    我们最近的工作呢,是想要利用Maya的资源,尤其是图片资源,来制作新的界面。由于Maya是基于Qt开发的,因此要获取图片资源,除了Maya文件夹里D:\Develop\Autodesk\Maya2018\icons文件之外,还需要从资源文件中获取到。而资源文件一般是编译成C++代码放在程序的某个位置了,所以我们一般是看不到的。我们就开始想,既然Maya能够成功地读取并且显示,我们通过Maya的插件开发,不也能够获取并且显示到需要的图标吗?由于Qt的经验,我开始研究通过写Maya插件来获取到Maya资源文件的方法。

    1. 新打开Maya软件,点击右下角的脚本图标,我们开始输入脚本:
      ad141613-63a5-4a93-9b79-3d6ca44da782-image.png

    2、我们通过Qt for Python来从Maya中获取到图标信息。由于Maya是构建在Qt 5.6.1上的,当时还不叫Qt for Python,而是PySide2。当然用法也是差不多的。更重要的是Qt 5.6.1已经支持QML了,可以支持QML的基本绘图方法。所以我们打算结合Qt for Python和QML来实现相关的功能。其实这样一组合就和Maya没有什么关系了。剩下的都是Qt的技术。
    我们的脚本是这样的:

    from PySide2.QtQuick import QQuickView
    from PySide2.QtCore import QDir, QFileInfo, QUrl
    
    def getMayaResourceFileList( nameFilter ):
        dir = QDir( ":/" )
        return dir.entryList( nameFilter )
    
    view = QQuickView( )
    view.setResizeMode( QQuickView.SizeViewToRootObject )
    mainUrl = QUrl.fromLocalFile( "C:/Users/huawei/Documents/ImageGridView.qml" )
    view.setSource( mainUrl )
    view.show( )
    rootItem = view.rootObject( )
    if rootItem != None:
        rootItem.setProperty( "prefix", "qrc:/" )
        rootItem.setProperty( "model", getMayaResourceFileList( '*.png' ) )
    

    其中C:/Users/huawei/Documents/ImageGridView.qml是我本地的路径,可以改为任意的路径甚至是http路径呢。

    1. 我们还得完成ImageGridView.qml文件内容,其实也非常简单,大概是这样的:
    import QtQuick 2.6
    
    GridView
    {
        id: root
        width: 320
        height: 480
        cellWidth: 80
        cellHeight: 80
    
        delegate: Image
        {
            width: 80
            height: 80
            source: root.prefix + modelData
    
            Text
            {
                anchors
                {
                    left: parent.left
                    right: parent.right
                    bottom: parent.bottom
                }
                text: modelData
                wrapMode: Text.Wrap
            }
        }
        model: 40
        property string prefix
    }
    

    22ae8472-0bb3-4342-ae72-e1cb54bd87a7-image.png

    4、这些文件准备就位了!我们打开一下Maya软件,看看结果~
    f430332d-c824-47d3-8d1c-b17b3c53bc97-image.png
    它是一个可滑动的界面,每行显示4列,然后下面是文字的内容,展示了图标的名称。我们可以借此工具拿到我们感兴趣的图标的路径,然后应用到我们制作的界面上。其实,如果你觉得图片好,也可以通过QImage以及QPixmap给转存出去自己用。

    如果你觉得文章很棒,记得点赞哦。

    posted in 技术博客区
  • RE: 游戏引擎Allegro之例子2

    看到Allegro也是由一个while ( 1 )死循环完成的啊。游戏似乎都是用死循环来进行逻辑和渲染。

    posted in 技术博客区
  • RE: 游戏引擎Allegro之例子1

    @青山白云 这款游戏引擎似乎有很多很棒的游戏支撑着的呢。🐱

    posted in 技术博客区
  • Maya插件的学习

    MStatus是描述Maya状态的一个类。其中MStatus.perror()表示在Output Window中显示错误信息。
    MPxLocatorNode 是NPxNode的一个子类,它表示的是类似坐标轴等辅助的节点,它不参加渲染,只是起辅助作用。可以使用原生的OpenGL调用。
    MPxDeformerNode 是描述的是形变的节点,定义的是形变的内容。

    获取物体的类别可以写这样的Python代码:
    import maya.cmds
    print cmds.getClassification( "lambert" )
    可得:[u'drawdb/shader/surface/lambert:shader/surface']
    参考:https://help.autodesk.com/view/MAYAUL/2019/CHS/?guid=__CommandsPython_getClassification_html

    MPx开头的类表明是Proxy的类
    MFn开头的类表明是Function Set类

    Maya的例子FootPrintNode和RawFootPrintNode的区别是RawFootPrintNode它有实现draw()函数,它实现了跨渲染器(DX和OpenGL)的渲染。😛

    posted in 技术博客区
  • 开发Maya最简单插件的步骤

    由于我使用的是Maya 2018,而Maya 2018是在Visual Studio 2017上进行编译的,所以我们需要下载Visual Studio 2017。
    1、首先打开Visual Studio 2017,创建一个简单的VS项目。Ctrl + Shift + N,使用Windows桌面向导进行创建。

    注意不要创建stdafx.h 头,不使用stdafx头进行构建。
    然后创建一个文件FirstMayaPlugin.cpp 进行处理。

    2、将Debug改为ReleaseDebug,并且将win32改为x64。

    3、设置下面的属性
    3.1 附加包含目录中,要有D:\Develop\devkitBase\include
    3.2 优化改为已禁用,为了调试符号的正确性
    3.3 预处理宏中添加这些:

    NDEBUG
    OSWin_
    WIN32
    _WINDOWS
    _USRDLL
    NT_PLUGIN
    _HAS_ITERATOR_DEBUGGING=0
    _SECURE_SCL=0
    _SECURE_SCL_THROWS=0
    _SECURE_SCL_DEPRECATE=0
    _CRT_SECURE_NO_DEPRECATE
    TBB_USE_DEBUG=0
    __TBB_LIB_NAME=tbb.lib
    Bits64_
    

    3.4 附加库目录设为D:\Develop\devkitBase\lib
    3.5 附加依赖项设为
    Foundation.lib
    OpenMaya.lib
    3.6 改目标文件扩展名为.mll

    4、在FirstMayaPlugin.cpp 中添加以下的代码:

    #include <maya/MStatus.h>
    #include <maya/MObject.h>
    #include <maya/MFnPlugin.h>
    
    #include <maya/MStatus.h>
    #include <maya/MObject.h>
    #include <maya/MFnPlugin.h>
    
    MStatus initializePlugin( MObject obj )
    {
    	MStatus status;
    	MFnPlugin plugin( obj, "Next Digital", "1.0", "Any" );
    	return status;
    }
    
    MStatus uninitializePlugin( MObject obj )
    {
    	MStatus status;
    	return status;
    }
    

    就可以顺利地编译了。

    这个插件就可以在Maya中顺利地进行载入了。

    posted in 技术博客区
  • Maya Viewport 2.0 学习笔记

    一些数据结构以及释义
    MVertexBuffer:对显卡的Vertex Buffer进行封装;
    MIndexBuffer:对显卡的Index Buffer进行封装;
    MGeometryRequirement
    MRenderItem:渲染的项目,包含了一个index buffer,多个vertex buffer,选定的着色器
    renderpasses:渲染的次数
    MVertexBufferDescriptor
    MVertexBufferDescriptionList
    MRenderItemList
    MPxDrawOverride:重新组织渲染语言的API,包括OpenGL的调用
    MPxGeometryOverride:整合外部着色器和DAG对象
    MPxShaderOverride:低层着色组织
    NPxSbadingNodeOverride:如何插件与其它软件的交互
    对比:NPxShaderOverride:全部渲染网络需要,NPxShadingNodeOverride:仅仅与其它插件的交互

    RenderOperation:类似一个renderpass
    渲染的Operation
    1、背景的Operation
    2、3D场景的Operation
    3、2D的HUD的Operation
    4、用户自定义Operation
    5、四方blt的Operation
    6、对象presentation的Operation

    MShaderManager

    开发者例子:viewRenderOverride

    Maya的渲染节点构成的是DAG(有向无环图),包含了transforms和shapes。
    MFnAssembly、MPxAssembly。

    posted in 技术博客区
  • 简明编译USD的步骤

    USD全称是Unified Scene Discription,是Pixar流程里推崇的一个规范。目前已经开源到github上了,作为普通开发者的我们,也可以利用起它。现在我介绍一下如何构建USD。

    USD的构建步骤还是有些繁琐的,需要你安装很多依赖库。
    下面列举了一些重要的依赖库:

    cmake 3.13.0
    cuda 10.0.130
    git for windows 2.19.1
    Maya 2018
    nasm 2.14.02
    Visual Studio 2017

    还有诸如Boost等第三方库依赖,这里就不介绍了。它里面的一个脚本build_script.py可以自动从固定的下载路径中下载需要的依赖然后顺利地进行编译。

    把这些东西安装好了之后,开始打开命令行,开始编译USD项目:
    假设所有依赖库放在D:\Develop文件夹中,我们可以在D盘根目录下建立一个批处理文件build_usd.bat。文件的内容是这样写的:

    :: 构建USD的脚本
    
    set Path=%Path%;D:\Develop\Python27;D:\Develop\Python27\Scripts;D:\Develop\NASM;D:\Develop\Autodesk\Maya2018\bin
    set PYTHONPATH=%PYTHONPATH%;D:\Develop\Autodesk\Maya2018\Python\Lib\site-packages;D:\Develop\Autodesk\Maya2018\Python\Lib\site-packages
    
    :: 复制pyside2-uic到pyside-uic.exe 中,使其造成能够找到pyside2-uic.exe的假象
    copy D:\Develop\Autodesk\Maya2018\bin\pyside2-uic D:\Develop\Autodesk\Maya2018\bin\pyside2-uic.exe
    
    :: 使用pip安装PyOpenGL
    pip install PyOpenGL
    
    :: 最后构建USD项目
    python .\USD\build_scripts\build_usd.py ^
    -j12 ^
    --build-args "USD,-DPYSIDE_USE_PYSIDE2=TRUE -DPYSIDE_BIN_DIR=D:\Develop\Autodesk\Maya2018\bin" ^
    --maya --maya-location D:\Develop\Autodesk\Maya2018\bin ^
    .\USD_Build
    

    这里因为要使用PySide2来代替PySide1进行构建(Maya2018附带了PySide2以及Qt 5.6.1,所以我们需要指定PySide2的开关。

    随后注意使用“适用于 VS 2017 的 x64 本机工具命令提示”这个命令提示符打开,主要我们想构建的是64位的应用程序。

    posted in 技术博客区
  • RE: Maya中使用PyQt开发笔记

    @jiangcaiyang 还是需要了解一下PyQt和Qt for Python的区别的。
    PyQt不是Digia原厂出的库;
    Qt for Python是Digia原厂出的库;原厂出的有保证。
    但是双方都有公司支持。目前PyQt使用范围广一些。但是一些大厂比如说Maya会使用Qt for Python更多一些。

    目前Maya使用的是Qt 5.6.1,并且根据自己的项目对Qt做了一些小的修改。然后Qt 5.6.1的时候还没有Qt for Python,而是PySide2。因此Maya2018使用的是PySide2。

    posted in 技术博客区