复现_TexGaussion
环境配置1
问题:生成真正的PBR材质失败
原因:论文原始代码中用于最终渲染的核心库 nvdiffrast,与你的 Windows 本地环境(Visual Studio 版本 + CUDA 版本组合)存在无法调和的兼容性问题。
解决方案:将环境配置设置成作者要求的
环境:
1. pytorch 2.4.0
2. cuda 12.4
3. vs 2022
4. python 3.10
环境配置2
- pytorch 2.1.0
- cuda 11.8
- vs 2019【VS2022 的最新版(17.14.x) 与 CUDA 11.8 不兼容,导致 nvdiffrast 编译时直接报 unsupported Microsoft Visual Studio version】
初始命令
set VCToolsInstallDir=C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207
set PATH=%VCToolsInstallDir%\bin\Hostx64\x64;%PATH%
set CUDAFLAGS=-allow-unsupported-compiler
set GALLIUM_DRIVER=llvmpipe
set PYOPENGL_PLATFORM=egl
set PATH=F:\paper\code\TexGaussian;%PATH%
F:
cd \paper\code\TexGaussian
.venv1\Scripts\activate
python texture.py objaverse --texture_name my_chair_test --ckpt_path ./checkpoints/PBR_model.safetensors --output_dir ./texture_mesh --save_image True --mesh_path ./assets/cube.obj --text_prompt "a wooden cube" 2>&1 | findstr /v "warning C4624" | findstr /v "note:" | findstr /v "flat_hash_map"
python texture.py objaverse --texture_name my_chair_test --ckpt_path ./checkpoints/PBR_model.safetensors --output_dir ./texture_mesh --save_image True --mesh_path ./assets/chair.obj --text_prompt "a wooden chair" 2>&1 | findstr /v "warning C4624" | findstr /v "note:" | findstr /v "flat_hash_map"
python texture.py objaverse --texture_name my_office_test --ckpt_path ./checkpoints/PBR_model.safetensors --output_dir ./texture_mesh --save_image True --mesh_path ./assets/office_chair.obj --text_prompt "a wooden office_chair" 2>&1 | findstr /v "warning C4624" | findstr /v "note:" | findstr /v "flat_hash_map"
代码报错内容
- 更换vs2019后,报错找不到"python310.lib"
解决方案:手动复制 python310.lib 到 VS 库目录: (.venv1) F:\paper\code\TexGaussian>copy "C:\Users\123\AppData\Local\Programs\Python\Python310\libs\python310.lib" "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64"
- 更换vs2019后,报错找不到这些函数的具体实现[Windows 环境(VS 2019)与 nvdiffrast 所需的较新 C++ 标准库不兼容]
torch_bindings.o : error LNK2019: 无法解析的外部符号 __std_find_trivial_1
torch_bindings.o : error LNK2019: 无法解析的外部符号 __std_search_1
torch_bindings.o : error LNK2019: 无法解析的外部符号 __std_find_end_1
nvdiffrast_plugin.pyd : fatal error LNK1120: 3 个无法解析的外部命令
解决方案:在 VS 2019 命令行中借用 VS 2022 的工具集
设置环境变量:
set VCToolsInstallDir=C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207
set PATH=%VCToolsInstallDir%\bin\Hostx64\x64;%PATH%
set CUDAFLAGS=-allow-unsupported-compiler
然后,在同一个命令行窗口中,激活你的虚拟环境并编译 nvdiffrast:
F:
cd \paper\code\TexGaussian
.venv1\Scripts\activate
cd \paper\code\nvdiffrast
pip uninstall nvdiffrast -y
pip install . --no-build-isolation
- fast_gauss 的核心问题:OpenGL 上下文初始化失败
NullFunctionError: Attempt to call an undefined alternate function (glCreateShader, glCreateShaderObjectARB), check for bool(glCreateShader) before calling
解决方案:①在 https://github.com/pal1000/mesa-dist-win/releases 页面下载mesa3d-26.1.1-release-msvc.7z;②解压后,将所有的dll文件复制到TexGaussian根目录下;
- NullFunctionError: Attempt to call an undefined alternate function (glCreateShader, glCreateShaderObjectARB), check for bool(glCreateShader) before calling
问题原因:Mesa3D 的 DLL 依赖于其他的动态链接库,而这些库不在系统的搜索路径里
解决方案:
①将x64下所有的dll文件复制到TexGaussian根目录下;
②设置环境变量,让 Mesa3D 的软件渲染生效
set GALLIUM_DRIVER=llvmpipe
set PYOPENGL_PLATFORM=egl
③将当前项目目录(包含 Mesa3D 所有 DLL 的文件夹)添加到系统 PATH 的最前面
set PATH=F:\paper\code\TexGaussian;%PATH%
- ShaderValidationError: Validation failure (0):
解决方案:
修改: F:\paper\code\TexGaussian\.venv1\lib\site-packages\OpenGL\GL\shaders.py 文件
修改内容:
if named.get('validate', True):
program.check_validate()
修改之后:
if named.get('validate', False):
program.check_validate()
-
ShaderLinkError: Link failure (0):
第5步修改禁用验证后,报错变了,说明第5步的原因是Mesa3D 版本与着色器代码不完全兼容,修改Mesa3D的版本为23.1.3,即mesa3d-23.1.3-release-msvc.7z;
又报错 ShaderValidationError: Validation failure (0):
按照序号5的方案修改 -
报错:ShaderLinkError: Link failure (0):
修改文件 F:\paper\code\TexGaussian\.venv1\lib\site-packages\OpenGL\GL\shaders.py
修改内容:
program = ShaderProgram( program )
glLinkProgram(program)
if named.get('validate', True):
program.check_validate()
program.check_linked()
for shader in shaders:
glDeleteShader(shader)
return program
直接替换成:
program = ShaderProgram( program )
glLinkProgram(program)
# if named.get('validate', True):
# program.check_validate()
# program.check_linked()
for shader in shaders:
glDeleteShader(shader)
return program
- ImportError: cannot import name 'cudart' from 'cuda' (unknown location)
问题原因:卡在了 fast_gauss 内部想要导入 cuda 模块的步骤,而这个模块通常需要额外安装 cuda-python。
解决方案:pip install cuda-python
- ImportError: cannot import name 'cudart' from 'cuda' (unknown location)
打开 F:\paper\code\TexGaussian\.venv1\lib\site-packages\fast_gauss\gsplat_utils.py
调整之前:from cuda import cudart
调整之后:from cuda.cudart import cudart
- ModuleNotFoundError: No module named 'cuda.cudart'
问题原因:新版的cuda-python(13.3.0)中,cuda.cudart这个导入路径可能已经不再支持;
13.3.0版的cuda-python 与 系统里的 11.8版的CUDA Toolkit不匹配
解决方案:降级cuda-python为11.8.1 与 CUDA11.8 匹配
# 1. 卸载当前的 cuda-python 及其绑定的组件
pip uninstall cuda-python cuda-bindings -y
# 2. 安装与 CUDA 11.8 兼容的版本 (例如 11.8.1)
pip install cuda-python==11.8.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
将F:\paper\code\TexGaussian\.venv1\lib\site-packages\fast_gauss\gsplat_utils.py中调整后的from cuda.cudart import cudart 均改回from cuda import cudart
- ModuleNotFoundError: No module named 'win32api'
报错原因:这个 win32api 是 pywin32 库的一部分,它提供了访问 Windows 底层 API 的功能。fast_gauss 的 CUDA 上下文管理需要它来与你的 NVIDIA 显卡驱动进行底层交互
解决方案:pip install pywin32
- Error: Attempt to retrieve context when no valid context
报错原因:fast_gauss 在尝试获取 OpenGL 上下文时失败了,说明在Window系统上,fast_gauss的软件渲染路径无法启动,Window对EGL的支持不原生,而MESA的EGL也无法正常工作;
调整文件
- F:\paper\code\TexGaussian.venv1\lib\site-packages\OpenGL\GL\shaders.py
找2026.6.9
虚拟机问题
VMware虚拟机默认使用的是虚拟显卡,无法直接访问宿主机的NVIDIA显卡;
生成一个假贴图
修改texture.py文件中的fit_mesh_uv方法
代码总结
texture.py
fit_mesh_uv():多视角渲染、优化
render_gs() -- render()
render_mesh()
gs.py ------------ render()
regression_models.py:
forward_gaussians():将 U-Net 的输出特征 x 映射为可渲染的高斯参数
复现
| 类别 | 核心任务 | 具体内容 | 完成情况 |
|---|---|---|---|
| 功能复现 | 跑通官方代码 | 使用作者提供的预训练模型和测试数据,成功生成结果(PBR材质图) | 已完成 |
| 性能复现 | 复现实验数据 | 复现论文中的定量实验,如FID/KID指标、推理时间,并与论文报告的数据对比。 | 待完成 |
| 研究复现 | 从零训练模型 | 从头开始训练一个新的模型,并使用自己的测试集(如ShapeNet)评估其性能。 | 待完成 |
| 算法复现 | 独立实现论文方法 | 在不参考官方代码的情况下,根据论文的描述独立实现完整算法。 | 无需完成 |
功能复现的数据流向
执行命令:python texture.py objaverse --texture_name my_office_test --ckpt_path ./checkpoints/PBR_model.safetensors --output_dir ./texture_mesh --save_image True --mesh_path ./assets/office_chair.obj --text_prompt "a wooden office_chair" 2>&1 | findstr /v "warning C4624" | findstr /v "note:" | findstr /v "flat_hash_map"
阶段一:数据准备(从硬盘到GPU)
- texture.py 主入口 Converter.load_mesh(opt.mesh_path)
- 指定的 --mesh_path ./assets/cube.obj 作为参数传入
- 表面采样(trimesh.sample.sample_surface)
- 在网格表面均匀采样num_samples个点 默认200000个。这些点及其法线是后续构建八叉树的原始数据
- 构建八叉树(ocnn.octree.Octree)
- 核心调用是self.points2octree(pts)
- 提取调用特征(octree.get_input_feature)
- 从八叉树中提取初始特征张量self.input_data,将成为3D U-Net的输入
- 此时,数据已经从.obj文件,成功转化为模型可以处理的输入self.input_data
阶段二:推理(数据通过网络流动)模型处理数据并生成最终材质的过程
- 特征提取(3D U-Net,core/octree_unet.py)
- self.input_data被送入self.model。网络通过下采样和上采样,提取并整合多尺度的空间特征,最终输出一个特征张量x
- 参数映射 (core/regression_models.py)
- forward_gaussians 方法接收特征张量 x,通过不同的激活函数,将 x 映射的属性被拼接成最终的 3D 高斯参数
- 渲染优化
- 通过对比 render_gs(高斯渲染)和 render_mesh(纹理渲染)的结果,来优化纹理图。
- 导出结果
- export_mesh 方法将优化后的纹理图 (self.albedo) 保存为 albedo_mesh_albedo.png。
- 同时,将包含UV坐标的 albedo_mesh.obj 文件保存到硬盘。
本文来自博客园,作者:jsqup,转载请注明原文链接:https://www.cnblogs.com/jsqup/p/21004641

浙公网安备 33010602011771号