shader开发工具

shadered

https://shadered.org/

下载安装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