shadered
下载安装exe后,配置vscode插件路径

shadered开发的项目,sprj文件可以在shadered中启动运行
help>information中查看
内置的uniform
glslviewer
https://github.com/patriciogonzalezvivo/glslViewer
源代码uniform文件查看内置的uniform变量
osgviewer
通过osgviewer启动加载指定的shader渲染,并监控文件变化刷新显示
c++
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_ptr<osg::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_ptr<EdgeModeHandler> edgeHandler = new EdgeModeHandler();
viewer.addEventHandler(edgeHandler);
// 启动热重载线程(检测着色器文件变化)
std::map<std::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_ptr<osg::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
