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依赖放在同一目录下(或者环境变量之中)。如下图:
Houdini Python
Houdini的python路径在HOUDINI_PATH\\pythonxx
(Houdini19.5使用的是python3.9)。
Houdini python添加第三方库
- 首先下载gei-pip.py,然后放在对应python版本的目录
- 在python版本的目录运行
pythonxx.exe get-pip.py
- 然后就可以在运行命令
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)
-
一般上述两步即可以进行调试,我们还可以
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)开始。
在Houdini使用UDIM:
-
在Mat视图上创建principledshader节点,在Texture那一栏中勾选Use Texture,Texture输入纹理所在的路径,加上
<UDIM>
标记(文件名也带有1001,1002等) -
在geo视图上创建material节点,然后material中引用创建的principledshader,最后如下图