cJSON 的简单应用——保存/解析 Shader 参数 【代码示例】

简介: cJSON 的简单应用——保存/解析 Shader 参数 【代码示例】

自定义的 Shader 程序结构体:

struct ShaderProgram
{
    struct Path
    {
        char *vertex_shader_path;
        char *fragment_shader_path;
    } path;
    struct FragmentShaderUniformLocation
    {
        char *channel_0;
        char *channel_1;
        char *global_time;
        char *resolution;
    } fsul;
};

入口函数:

int main()
{
#ifdef TOFILE
  createObjects();
#else
    parseFile("result.txt");
#endif
    return 0;
}

创建 (Shader Program) JSON 对象并保存为 txt 的函数:

void createObjects()
{
#if MUL
  ShaderProgram sp[2] =
  {
    {
      { "../Shader/vs_0.glsl", "../Shader/fs_0.glsl" },
      { "iChannel0", "iChannel1", "iGlobalTime", "iResolution" }
    },  // sp[0]
    {
      { "../Shader/vs_1.glsl", "../Shader/fs_1.glsl" },
      { "iChannel0", "iChannel1", "iGlobalTime", "iResolution" }
    } // sp[1]
  };
#else
  ShaderProgram sp =
  {
    { "../Shader/vs_0.glsl", "../Shader/fs_0.glsl" },
    { "iChannel0", "iChannel1", "iGlobalTime", "iResolution" }
  };
#endif
  cJSON *root = cJSON_CreateArray();
  cJSON *fld = NULL, *fldd_0 = NULL, *fldd_1;
#if MUL
  for (int i = 0; i < 2; i++)
  {
    cJSON_AddItemToArray(root, fld = cJSON_CreateArray());
    cJSON_AddItemToArray(fld, fldd_0 = cJSON_CreateObject());
    cJSON_AddStringToObject(fldd_0, "Vertex Shader Path", sp[i].path.vertex_shader_path);
    cJSON_AddStringToObject(fldd_0, "Fragment Shader Path", sp[i].path.fragment_shader_path);
    cJSON_AddItemToArray(fld, fldd_1 = cJSON_CreateObject());
    cJSON_AddStringToObject(fldd_1, "Channel 0", sp[i].fsul.channel_0);
    cJSON_AddStringToObject(fldd_1, "Channel 1", sp[i].fsul.channel_1);
    cJSON_AddStringToObject(fldd_1, "Global Time", sp[i].fsul.global_time);
    cJSON_AddStringToObject(fldd_1, "Resolution", sp[i].fsul.resolution);
  }
#else
  cJSON_AddItemToArray(root, fld = cJSON_CreateArray());
  cJSON_AddItemToArray(fld, fldd_0 = cJSON_CreateObject());
  cJSON_AddStringToObject(fldd_0, "Vertex Shader Path", sp.path.vertex_shader_path);
  cJSON_AddStringToObject(fldd_0, "Fragment Shader Path", sp.path.fragment_shader_path);
  cJSON_AddItemToArray(fld, fldd_1 = cJSON_CreateObject());
  cJSON_AddStringToObject(fldd_1, "Channel 0", sp.fsul.channel_0);
  cJSON_AddStringToObject(fldd_1, "Channel 1", sp.fsul.channel_1);
  cJSON_AddStringToObject(fldd_1, "Global Time", sp.fsul.global_time);
  cJSON_AddStringToObject(fldd_1, "Resolution", sp.fsul.resolution);
#endif
  char *out = cJSON_Print(root);
  // 保存信息到文件
  writeToFile("result.txt", out);
  printf("Debug Info: %s", out);
  free(out);
  cJSON_Delete(root);
}

解析本地 txt 的函数:

void parseFile(char *filename)
{
    FILE *f;
    long len;
    char *data;
    f = fopen(filename, "rb");
    fseek(f, 0, SEEK_END);
    len = ftell(f);
    fseek(f, 0, SEEK_SET);
    data = (char *)malloc(len + 1);
    fread(data, 1, len, f);
    fclose(f);
    //easyParse(data);
    itemParse(data);
    free(data);
}
void itemParse(char *text)
{
    cJSON *json;
    json = cJSON_Parse(text);
    if (!json)
    {
        printf("Error before: [%s]\n", cJSON_GetErrorPtr());
    }
    else
    {
        int size_0 = cJSON_GetArraySize(json);
        printf("Shader Program Nums = %d\n", size_0);
        for (int i = 0; i < size_0; i++)
        {
            cJSON *pItem = cJSON_GetArrayItem(json, i);
            if (NULL == pItem)
            {
                continue;
            }
            int size_1 = cJSON_GetArraySize(pItem);
            //printf("Shader Program Item Nums = %d\n", size_1);
            printf("===========================\n");
            for (int j = 0; j < size_1; j++)
            {
                cJSON *ppItem = cJSON_GetArrayItem(pItem, j);
                //printJSON(ppItem);
                int size_2 = cJSON_GetArraySize(ppItem);
                printf("Shader Program Item Size  = %d\n", size_2);
                //printf("---------------------------\n");
                for (int k = 0; k < size_2; k++)
                {
                    cJSON *pppItem = cJSON_GetArrayItem(ppItem, k);
                    printJSON(pppItem);
                }
                printf("===========================\n");
            }
        }
    }
    cJSON_Delete(json);
}

生成的 txt 内容为:

开启 MUL 宏的情况[

   [

       {

           "Vertex Shader Path": "../Shader/vs_0.glsl",

           "Fragment Shader Path": "../Shader/fs_0.glsl"

       },

       {

           "Channel 0": "iChannel0",

           "Channel 1": "iChannel1",

           "Global Time": "iGlobalTime",

           "Resolution": "iResolution"

       }

   ],

   [

       {

           "Vertex Shader Path": "../Shader/vs_1.glsl",

           "Fragment Shader Path": "../Shader/fs_1.glsl"

       },

       {

           "Channel 0": "iChannel0",

           "Channel 1": "iChannel1",

           "Global Time": "iGlobalTime",

           "Resolution": "iResolution"

       }

   ]

]

或未开启 MUL 的情况[

   [

       {

           "Vertex Shader Path": "../Shader/vs_0.glsl",

           "Fragment Shader Path": "../Shader/fs_0.glsl"

       },

       {

           "Channel 0": "iChannel0",

           "Channel 1": "iChannel1",

           "Global Time": "iGlobalTime",

           "Resolution": "iResolution"

       }

   ]

]

相关阅读

使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

 

目录
相关文章
|
6月前
|
算法 PyTorch 算法框架/工具
昇腾 msmodelslim w8a8量化代码解析
msmodelslim w8a8量化算法原理和代码解析
399 5
|
5月前
|
机器学习/深度学习 文字识别 监控
安全监控系统:技术架构与应用解析
该系统采用模块化设计,集成了行为识别、视频监控、人脸识别、危险区域检测、异常事件检测、日志追溯及消息推送等功能,并可选配OCR识别模块。基于深度学习与开源技术栈(如TensorFlow、OpenCV),系统具备高精度、低延迟特点,支持实时分析儿童行为、监测危险区域、识别异常事件,并将结果推送给教师或家长。同时兼容主流硬件,支持本地化推理与分布式处理,确保可靠性与扩展性,为幼儿园安全管理提供全面解决方案。
230 3
|
6月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
283 27
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
558 29
|
6月前
|
供应链 项目管理 容器
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
在当今快速变化的商业环境中,对象管理组织(OMG)推出了三种强大的建模标准:BPMN(业务流程模型和符号)、CMMN(案例管理模型和符号)和DMN(决策模型和符号)。它们分别适用于结构化流程管理、动态案例处理和规则驱动的决策制定,并能相互协作,覆盖更广泛的业务场景。BPMN通过直观符号绘制固定流程;CMMN灵活管理不确定的案例;DMN以表格形式定义清晰的决策规则。三者结合可优化企业效率与灵活性。 [阅读更多](https://example.com/blog)
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
|
6月前
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
6月前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
206 4
|
6月前
|
人工智能 自然语言处理 算法
DeepSeek大模型在客服系统中的应用场景解析
在数字化浪潮下,客户服务领域正经历深刻变革,AI技术成为提升服务效能与体验的关键。DeepSeek大模型凭借自然语言处理、语音交互及多模态技术,显著优化客服流程,提升用户满意度。它通过智能问答、多轮对话引导、多模态语音客服和情绪监测等功能,革新服务模式,实现高效应答与精准分析,推动人机协作,为企业和客户创造更大价值。
575 5
|
6月前
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
6月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS