
shaderedhttps://shadered.org/下载安装exe后配置vscode插件路径shadered开发的项目sprj文件可以在shadered中启动运行helpinformation中查看内置的uniformglslviewerhttps://github.com/patriciogonzalezvivo/glslViewer源代码uniform文件查看内置的uniform变量osgviewer通过osgviewer启动加载指定的shader渲染并监控文件变化刷新显示int main(int argc, char** argv) { std::locale::global(std::locale(ZH_CN.UTF-8)); osg::ArgumentParser args(argc, argv); osgViewer::Viewer viewer(args); // 配置路径请根据实际情况修改 const std::string WORK_DIR D:/OpenSource/WorkStation/cpp/; const std::string MODEL_PATH WORK_DIR 1.osg; // 你的模型文件 const std::string VERT_PATH WORK_DIR v.glsl; const std::string FRAG_PATH WORK_DIR f.glsl; const std::string GEMO_PATH WORK_DIR g.glsl; const std::string MESH_PATH WORK_DIR g_mesh.glsl; // 设置窗口位置和大小 viewer.setUpViewInWindow(2000, 300, 400, 300); // 添加事件处理器 viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgViewer::StatsHandler()); // 配置相机 osg::ref_ptrosg::Camera camera viewer.getCamera(); camera-setClearColor(osg::Vec4(.2f, .2f, .2f, 1.0f)); camera-setProjectionMatrixAsPerspective(60.0f, 1024.0f/768.0f, 0.1f, 1000.0f); // 创建键盘事件处理器 osg::ref_ptrEdgeModeHandler edgeHandler new EdgeModeHandler(); viewer.addEventHandler(edgeHandler); // 启动热重载线程检测着色器文件变化 std::mapstd::string, std::filesystem::file_time_type fileTimeMap; std::thread([]() { std::cout [信息] 热重载线程已启动 std::endl; do { bool isChanged false; if (fileTimeMap[VERT_PATH] ! std::filesystem::last_write_time(VERT_PATH)) { fileTimeMap[VERT_PATH] std::filesystem::last_write_time(VERT_PATH); isChanged true; std::cout [信息] 检测到顶点着色器变化 std::endl; } if (fileTimeMap[FRAG_PATH] ! std::filesystem::last_write_time(FRAG_PATH)) { fileTimeMap[FRAG_PATH] std::filesystem::last_write_time(FRAG_PATH); isChanged true; std::cout [信息] 检测到片元着色器变化 std::endl; } if (fileTimeMap[MESH_PATH] ! std::filesystem::last_write_time(MESH_PATH)) { fileTimeMap[MESH_PATH] std::filesystem::last_write_time(MESH_PATH); isChanged true; std::cout [信息] 检测到片元着色器变化 std::endl; } if (fileTimeMap[GEMO_PATH] ! std::filesystem::last_write_time(GEMO_PATH)) { fileTimeMap[GEMO_PATH] std::filesystem::last_write_time(GEMO_PATH); isChanged true; std::cout [信息] 检测到几何着色器变化 std::endl; } if (isChanged) { std::cout [信息] 重新加载着色器... std::endl; osg::ref_ptrosg::Node newRootNode; if (std::filesystem::exists(MODEL_PATH) std::filesystem::exists(MODEL_PATH)) { newRootNode createCubeWithShader(viewer, VERT_PATH, FRAG_PATH, GEMO_PATH,MESH_PATH); // newRootNode loadModelWithShader(viewer, MODEL_PATH, VERT_PATH, FRAG_PATH, GEMO_PATH,MESH_PATH); } } std::this_thread::sleep_for(std::chrono::milliseconds(500)); } while (true); }).detach(); return viewer.run(); }osg中打开日志等级提示shader中编译错误会在控制台打印osg::setNotifyLevel(osg::NOTICE);不过osg的控制台可能错误比较多通过osg::ArgumentParser输入正确的glsl版本可以减少错误提示例如–glsl-version 3.1