Loading

Houdini HDK踩坑记录

Houdini HDK踩坑记录

Houdini HDK编译

cmake 构建

根据官方的教程,我们可以使用cmake对HDK项目进行构建,官方文档之中有详细的介绍。官方推荐使用的VS2019,但是目前Houdini19.5是支持VS2022的(可以编译后识别到)。

# Specify the minimum required version of CMake to build the project.
cmake_minimum_required( VERSION 3.6 )
#need to add to find the HoudiniConfig.cmake
list( APPEND CMAKE_PREFIX_PATH  "${HOUDINI_PATH}\\toolkit\\cmake")
project( My_HDK_Project )
# Locate Houdini's libraries and header files.
# Registers an imported library target named 'Houdini'.
find_package( Houdini REQUIRED )
# Add a library with two source files.
set( library_name SOP_Star )
add_library( ${library_name} SHARED
    SOP_Star.C
    SOP_Star.h
)
# Link against the Houdini libraries, and add required include directories and compile definitions.
target_link_libraries( ${library_name} Houdini )
# Configure several common target properties, such as its output directory.(Such as output pah)
houdini_configure_target( ${library_name} )

HOUDINI_PATH改为houdini的所在路径,即可接入houdini hdk

详情可以参考一下博客:https://yaksue.blog.csdn.net/article/details/111277070

xmake 构建

感谢星姐提的issue,这个我们就可以使用下面的代码调用cmake从而将houdini hdk的依赖加入

add_requires("cmake::Houdini", {alias = "houdini", system = true, configs = {search_mode = "config",link_libraries = "Houdini",envs = {CMAKE_PREFIX_PATH = "HOUDINI_PATH\\toolkit\\cmake"}}})

HOUDINI_PATH改为houdini的所在路径,即可接入houdini hdk

但是xmake不能调用cmake函数,所以并不能调用houdini_configure_target这个函数一键配置,但是我们可以手动设置输出目录,根据Houdini的DSO插件的官方文档,我们一般使用用户文档目录下的dso目录C:\Users\Ligo\Documents\houdini19.5\dso

set_targetdir("C:\\Users\\Ligo\\Documents\\houdini19.5\\dso")

因为我们可以简单的改下官方示例SOP_PointWave的cmake的模板,使用如下xmake模板

add_requires("cmake::Houdini", {alias = "houdini", system = true, configs = {
    search_mode = "config",
    link_libraries = "Houdini",
    envs = {CMAKE_PREFIX_PATH = "HOUDINI_PATH\\toolkit\\cmake"}
}})


target("SOP_PointWave")
    add_undefines("DEBUG","_DEBUG")
    set_kind("shared")
    add_packages("houdini")
    set_targetdir("C:\\Users\\用户名\\Documents\\houdini19.5\\dso")
    add_headerfiles("SOP_PointWave.h")
    add_files("SOP_PointWave.cpp")
target_end()

目前有两点需要注意:

  • xmake没有定义Houdini.C文件的编译规则,但是使用cpp后缀暂时也不会产生什么问题

  • Houdini不止debug模式,因为在debug模式下会引入DEBUG(_DEBUG)符号,从而会导致tbb的库链接到tbb_debug.lib这个静态库(Houdini并没有提供)

    error: LINK : fatal error LNK1104: 无法打开文件“tbb_debug.lib”
    

    但是使用cmake的find_package ,无论是xmake模式下的release或者releasedbg模式都会引入DEBUG(_DEBUG)符号,所以我们使用add_undefines函数将该符号取消即可。

DLL依赖

之前一直遇到一个BUG就是Houdini怎么也识别不出编译出来的SOP_xxx.dll,后面发现是dll依赖并没有找到,我们可以在vspowershell中使用如下命令

dumpbin /dependents file_name

找到dll依赖,并把dll依赖放在同一目录下(或者环境变量之中)。如下图:

image-20230612135036496

Houdini Python

Houdini的python路径在HOUDINI_PATH\\pythonxx(Houdini19.5使用的是python3.9)。

Houdini python添加第三方库

  1. 首先下载gei-pip.py,然后放在对应python版本的目录
  2. 在python版本的目录运行pythonxx.exe get-pip.py
  3. 然后就可以在运行命令pythonxx.exe -m pip install xxx

HDK调用python

根据HDK的官方文档PY_Python.h,我们可以使用以下函数在HDK实现C++调用python代码/文件。

// init python interpretion(must be called firstly)
PYsetAutoInitializeFromPython(false);
// according to file_name and args (return a new running thread)
PYrunPythonStatementsFromFileInNewThread(const char *file_name, UT_String &errors)
// same as above,but python_code is the code string
PYrunPythonStatementsInNewThread (const char *python_code, UT_String &errors)

Houdini HDK Debug

根据这个教程,我们可以使用VS对Houdini HDK进行Debug

  • 首先我们使用上述方法编译一个DLL,然后打开Houdini(保证Houdini识别的到dll)

    VS的编译模式要选择RelWithDebInfo模式,首先是因为HDK不支持debug模式(用debug会产生一些debug依赖库xxxxd.dll,但是Houdini的环境之中并没有,从而导致识别不了),然后是因为release模式并没有生成调试信息。

  • VS在代码之中打一个断点,然后调试使用附加到进程并找到Houdini的进程(如果出现识别到python进程,可以将调试类型设置为native)

    image-20230612100106439

  • 一般上述两步即可以进行调试,我们还可以houdini.env文件之中添加环境变量来获得更多的信息

    • HOUDINI_COREDUMP:从而在开启debug时候,如果houdini出现了崩溃可以及时反馈以及调试
    • HOUDINI_DSO_ERROR:打印与DSO相关的错误信息(具体看官方文档)
    #Setting this environment variable to 1 is useful for debugging HDK crashes.
    HOUDINI_COREDUMP=1
    #The existence of the variable in the environment (or setting its value to 1) will cause dynamic linking errors to be output.
    #Setting the value to 2 will cause more verbose errors to be printed.
    #Setting the value to 3 will cause all DSO related messages to be #printed.
    #Setting the value to 4 will cause timing messages to be printed.
    HOUDINI_DSO_ERROR=2 
    

Hoduini UDIM

UDIM(U-Dimension):它允许纹理贴图被被分割成多个独立的贴图,每个图块都有自己的编号。优势在于可以将一个大的纹理贴图分割成多个小的图块,这样可以更好地管理和组织纹理贴图,并且可以每个图块都可以独立加载和渲染。

一般用数字表示,在Houdini上使用1001,1002。UV坐标就不会被限定到[0,1]区间之间,我们可以使用更为广阔的坐标区间,容易下图中左下角从(0,0)开始。

image-20230612151821622

在Houdini使用UDIM:

  • 在Mat视图上创建principledshader节点,在Texture那一栏中勾选Use Texture,Texture输入纹理所在的路径,加上<UDIM>标记(文件名也带有1001,1002等)

  • 在geo视图上创建material节点,然后material中引用创建的principledshader,最后如下图

    image-20230612152516326

    image-20230612152529743

    image-20230612152740027

posted @ 2023-06-12 17:48  Ligo丶  阅读(185)  评论(0编辑  收藏  举报