cJSON 的简单应用——保存/解析 Shader 参数 【代码示例】
发布日期:2021-07-01 05:53:32
浏览次数:3
分类:技术文章
本文共 4984 字,大约阅读时间需要 16 分钟。
自定义的 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" } ]]
相关阅读
转载地址:https://panda1234lee.blog.csdn.net/article/details/53312328 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月22日 17时24分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Windows 10将预装Windows Terminal
2019-05-02
老板要我开发一个简单的工作流引擎 !
2019-05-02
Java编程思想笔记——第五章 初始化和清理
2019-05-02
MySQL学习笔记——慢查询
2019-05-02
Java实现排列组合
2019-05-02
PL/SQL学习笔记之触发器
2019-05-02
Memcache内存缓存框架
2019-05-02
Python字符编码和转码
2019-05-02
commons-dbutils【不推荐】
2019-05-02
SOCAT端口转发
2019-05-02
docker快速搭建HTTP代理
2019-05-02
前端学习 -- 颜色
2019-05-02
前端学习 -- Css -- 盒子模式
2019-05-02
什么是多线程?看我多线程七十二变,你能记住吗?
2019-05-03
Netty hello world 入门源码分析
2019-05-03
Netty 中的 handler 和 Pipeline
2019-05-03
ActiveReports 报表应用教程 (15)---报表换肤
2019-05-03
ActiveReports 报表应用教程 (14)---数据可视化
2019-05-03
Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
2019-05-03
Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】
2019-05-03