【开发日志】2023.04 ZENO----Composite----CompImport、ReadImageFlie

news2024/9/24 19:22:05

CompImport

TEST:

用ParticlesWrangle创造属性A(紫色),B(青色) ,用CompImport结点将属性转化为图片输入到Composite3进行合成

Input:

Output:

/* 导入地形网格的属性,可能会有多个属性。它将地形的属性转换为图
像,每个属性对应一个图层。
可能需要的参数:outRemapRange,分辨率,属性名称,属性数据
类型为float32 */
struct CompImport : INode {
    virtual void apply() override {
        auto prim = get_input<PrimitiveObject>("prim");
        auto &ud = prim->userData();
        int nx = ud.get2<int>("nx");
        int ny = ud.get2<int>("ny");
        auto attrName = get_input2<std::string>("attrName");

        auto image = std::make_shared<PrimitiveObject>();
        image->resize(nx * ny);

        if (prim->verts.attr_is<float>(attrName)) {
            auto &attr = prim->attr<float>(attrName);
            for (auto i = 0; i < nx * ny; i++) {
                float v = attr[i];
                image->verts[i] = {v, v, v};
            }
        }
        else if (prim->verts.attr_is<vec3f>(attrName)) {
            auto &attr = prim->attr<vec3f>(attrName);
            for (auto i = 0; i < nx * ny; i++) {
                image->verts[i] = attr[i];
            }
        }

        image->userData().set2("isImage", 1);
        image->userData().set2("w", nx);
        image->userData().set2("h", ny);

        set_output("image", image);
    }
};

ZENDEFNODE(CompImport, {
    {
        {"prim"},
        {"string", "attrName", ""},
    },
    {
        {"image"},
    },
    {},
    { "comp" },
});

ReadImageFlie

stb_image 库读取 PNG 文件,使用 OpenEXR 库读取 EXR 文件。读取 EXR 文件并使用图像数据(包括 alpha 通道)填充。

  1. stbi_set_flip_vertically_on_load(true);设置在使用stb_image库加载图像时垂直翻转图像的选项。这是计算机图形学中的常见约定,因为图像数据通常首先存储在顶行,而 OpenGL 和其他图形 API 期望首先存储底行。
  2. float* data = stbi_loadf(path.c_str(), &w, &h, &n, 0);在给定路径处加载图像文件,并返回指向包含其像素数据的缓冲区的指针。、 和 是分别接收图像的宽度、高度和通道数的输出参数。该函数用于将图像加载为浮点数据。whnstbi_loadf
  3. if (!data) { ... }通过检查指针是否为 null 来检查图像加载是否成功。如果为 null,则引发异常。data
  4. scope_exit delData = [=] { stbi_image_free(data); };定义使用 C++11 的作用域保护,以便在函数返回或引发异常时自动释放stb_image分配的内存。这对于防止内存泄漏非常重要。scope_exit
  5. auto img = std::make_shared<PrimitiveObject>();创建指向 .PrimitiveObject
  6. img->verts.resize(w * h);调整 的矢量大小以容纳元素。 可能以某种形式表示图像的顶点。vertsPrimitiveObjectw * hverts
  7. if (n == 3) { ... }检查图像是否具有三个通道(红色、绿色、蓝色)。如果是这样,则使用 .vertsstd::memcpy
  8. else if (n == 4) { ... }检查图像是否有四个通道(红色、绿色、蓝色、Alpha)。如果是这样,像素数据将分别拆分为 RGB 和 alpha 通道的单独数组和数组,并使用下标表示法存储在矢量中。vec3ffloatverts
  9. else if (n == 2) { ... }检查图像是否具有两个通道(亮度、Alpha)。如果是这样,则像素数据存储为矢量中具有零 Z 分量的对象。vec3fverts
  10. else if (n == 1) { ... }检查图像是否具有一个通道(亮度)。如果是这样,则像素数据存储为对象,其中 X 分量中的单通道值为零,Y 和 Z 分量为零。vec3f
  11. else { ... }如果通道数不是预期值之一,则引发异常。
  12. img->userData().set2("isImage", 1);设置用户数据字段 以指示它表示图像。PrimitiveObject
  13. img->userData().set2("w", w);设置的用户数据字段以存储图像的宽度。PrimitiveObject
  14. img->userData().set2("h", h);设置的用户数据字段以存储图像的高度。PrimitiveObject
  15. return img;返回指向表示加载图像的共享指针。PrimitiveObject
std::shared_ptr<PrimitiveObject> readImageFile(std::string const &path) {
    int w, h, n;
    stbi_set_flip_vertically_on_load(true);
    float* data = stbi_loadf(path.c_str(), &w, &h, &n, 0);
    if (!data) {
        throw zeno::Exception("cannot open image file at path: " + path);
    }
    scope_exit delData = [=] { stbi_image_free(data); };
    auto img = std::make_shared<PrimitiveObject>();
    img->verts.resize(w * h);
    if (n == 3) {
        std::memcpy(img->verts.data(), data, w * h * n * sizeof(float));
    } else if (n == 4) {
        auto &alpha = img->verts.add_attr<float>("alpha");
        for (int i = 0; i < w * h; i++) {
            img->verts[i] = {data[i*4+0], data[i*4+1], data[i*4+2]};
            alpha[i] = data[i*4+3];
        }
    } else if (n == 2) {
        for (int i = 0; i < w * h; i++) {
            img->verts[i] = {data[i*2+0], data[i*2+1], 0};
        }
    } else if (n == 1) {
        for (int i = 0; i < w * h; i++) {
            img->verts[i] = vec3f(data[i*2+0]);
        }
    } else {
        throw zeno::Exception("too much number of channels");
    }
    img->userData().set2("isImage", 1);
    img->userData().set2("w", w);
    img->userData().set2("h", h);
    return img;
}

std::shared_ptr<PrimitiveObject> readExrFile(std::string const &path) {
    int nx, ny, nc = 4;
    float* rgba;
    const char* err;
    int ret = LoadEXR(&rgba, &nx, &ny, path.c_str(), &err);
    if (ret != 0) {
        zeno::log_error("load exr: {}", err);
        throw std::runtime_error(zeno::format("load exr: {}", err));
    }
    nx = std::max(nx, 1);
    ny = std::max(ny, 1);
//    for (auto i = 0; i < ny / 2; i++) {
//        for (auto x = 0; x < nx * 4; x++) {
//            auto index1 = i * (nx * 4) + x;
//            auto index2 = (ny - 1 - i) * (nx * 4) + x;
//            std::swap(rgba[index1], rgba[index2]);
//        }
//    }

    auto img = std::make_shared<PrimitiveObject>();
    img->verts.resize(nx * ny);

    auto &alpha = img->verts.add_attr<float>("alpha");
    for (int i = 0; i < nx * ny; i++) {
        img->verts[i] = {rgba[i*4+0], rgba[i*4+1], rgba[i*4+2]};
        alpha[i] = rgba[i*4+3];
    }
//
    img->userData().set2("isImage", 1);
    img->userData().set2("w", nx);
    img->userData().set2("h", ny);
    return img;
}

struct ReadImageFile : INode {
    virtual void apply() override {
        auto path = get_input2<std::string>("path");
        if (zeno::ends_with(path, ".exr", false)) {
            set_output("image", readExrFile(path));
        }
        else {
            set_output("image", readImageFile(path));
        }
    }
};
ZENDEFNODE(ReadImageFile, {
    {
        {"readpath", "path"},
    },
    {
        {"PrimitiveObject", "image"},
    },
    {},
    {"comp"},
});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装 docker-registry 镜像仓库

一、运行如下命令安装docker-registry镜像仓库&#xff1a; docker run -d \ -p 5000:5000 \ -v /usr/local/registry:/var/lib/registry \ --restartalways \ --name registry \ registry:2 二、测试镜像生成并推送到镜像仓库 1、新建一个目录 mkdir target 2、上传一…

Taro+Vue3 小程序引入echarts表

背景&#xff1a;根据需求在一个报告界面需要展示不同的echarts表来使数据更友好的显示。 效果如下&#xff1a; 一.taro支持echarts 官方说明&#xff1a;Taro 文档支持引用小程序端第三方组件库 物料文档&#xff1a;Taro 物料市场 | 让每一个轮子产生价值 二.引入echart…

Qt5.12實戰之Linux靜態庫編譯與調用完整過程

1.安裝gedit sudo apt-get install gedit -y 2.使用gedit編輯靜態庫源文件test.cpp gedit test.cpp 輸入下面內容 &#xff1a; #include <stdio.h> int func() {return 888; } 如下圖操作&#xff1a; 保存test.cpp並編譯 爲目標文件 gcc -c test.cpp如下圖示&am…

【剑指 Offer】(1)

文章目录前言一、 数组中重复的数字:fire: 解决方法:dog: 代码二、二维数组中的查找:fire:思路:dog:代码三、替换空格:fire:思路:dog: 代码四、从尾到头打印链表:fire:思路:dog:代码:dog: 代码五、重建二叉树:fire:思路:dog: 代码总结前言 剑指offer系列是一本非常著名的面试题…

【BUG SHOW】一个由高并发引起的缺陷分析

软件质量保障: 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。 缺陷介绍 平台有这样的两个功能&#xff1a; ​功能01: 用户发起支付&#xff0c;成功则将表pay单据状态推进SUCCESS&#xff0c;然后发出支付结果消息&#xff1b;反之如果支付失败&#xff0c;则状态…

vue 报错 error:03000086:digital envelope routines::initialization error解决方案

目录 1. 引言: 2. 更换版本出现问题: 3. 出现原因: 4. 解决办法: -> 4. 1 删了 再换回16.15版本 -> 4.2 指令修改(好使) ---> 4.2.1效果如图 -> 4.3 其他指令就别试了 压根不好使 1. 引言: npm出现问题 , 卸载后 装了个新node 18.15版本 2. 更换版本…

Servlet-搭建个人博客系统(MVC架构模式简介,maven的配置和使用)

目录 1. MVC架构模式简介 2. maven的配置和使用 3. 项目总述&#x1f43b; 3.1 &#x1f34e;Controller层 3.2 &#x1f34e;Model层 3.3 &#x1f34e;View层 4. 页面的主要功能实现&#x1f43b; 4.1 &#x1f34e;登陆页面&#xff08;login.html&#xff09; 4.2…

Oracle Recovery Tools快速恢复断电引起的无法正常启动数据库----惜分飞

由于异常断电,数据库启动报错ORA-01113和ORA-01110&#xff0c;ORA-00322和ORA-00312以及ORA-00314和ORA-00312错误 Mon Apr 17 09:35:04 2023 ALTER DATABASE OPEN Errors in file D:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_10192.trc: ORA-01113: 文件 1 需…

史上最牛二分查找,不服来战

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

音视频-ffplay的音视频同步

最近自己在做一个视频播放器&#xff0c;渲染视频帧时有些疑惑&#xff0c;所以特意来学习一下ffplay中是如何处理视频帧的渲染的&#xff01;&#x1f60a; 我自己最初的理解是这样 1、只关心视频本身的时间戳&#xff0c;不考虑音视频同步以及其他的同步时钟&#xff0c;或…

写了那么久的文章,现在才改回来!

大家好&#xff0c;我是即兴小索奇&#xff0c;最近在阅读文章时发现了自己文章的一个缺陷&#xff0c;就记录下来并分享给大家&#xff0c;大家写文章时也可以借鉴。 这是我以前写的的文章&#xff0c;light亮色下显示正常 -当我不经意间把手机调成深色模式阅读文章时&#xf…

Leetcode912.排序数组(三路划分)

文章目录 一、三路划分二、Leetcode912.排序数组 一、三路划分 为何还会有三路划分&#xff1f; 快速排序算法在某个数据大量重复时效率极低&#xff0c;在运行程序时会超出时间限制&#xff0c;为了解决数据大量重复的情况下&#xff0c;三路划分诞生了。三路划分是基于快速排…

第五回:如何使用ListView Widget

文章目录概念介绍使用方法示例代码我们在上一章回中介绍了Container Widget,本章回中将介绍 ListView这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。概念介绍 ListView就是一个滚动的列表&#xff0c;它可以看作是在Column的基础上添加了滚动功能&…

WPS表格查找替换技巧:让你的工作效率翻倍

WPS表格中查找和替换是最基础的操作&#xff0c;看似简单&#xff0c;但是还有很多人在工作中不会熟练使用&#xff0c;其实掌握一些小技巧可以快速提高工作效率&#xff0c;本节课就来介绍几种比较有效的“查找和替换技巧”。 本节课目录&#xff1a; 1、常规的查找和替换 2…

AIGC市场群雄逐鹿,阿里云发出了什么大招?

如果要评选当下IT圈最火爆的话题&#xff0c;相信就算生成式AI&#xff08;Artificial Intelligence Generated Content&#xff0c;简称AIGC&#xff09;甘认第二&#xff0c;也没有人敢认第一。于是我们看到&#xff0c;在ChatGPT快速升级迭代的同时&#xff0c;百度、360、商…

基于树莓派的智能家居控制系统设计论文参考

完整论文咨询可WX联系&#xff1a;gyf1842965496 智能家居控制系统功能实现详细介绍&#xff1a;基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article/details/125491350#comments_26030679 目录 论文简述 摘要 随着科技的进步&#xff0c;人们生活水…

DAY 37 shell免交互

Here Document 概述 常用的交互程序&#xff1a;read&#xff0c;ftp&#xff0c;passwd&#xff0c;su&#xff0c;sudo cat也可配合免交互的方式重定向输出到文件 Here Document 的作用 使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品 格式 命令 &…

创建部署你的第一个智能合约

原文参考地址 【Web3 开发系列教程—创建你的第一个智能合约&#xff08;2&#xff09;】部署第一个智能合约&#xff0c;增加自己的内容 如果你是区块链开发的新手并且不知道从哪里开始&#xff0c;或者你只是想了解如何部署智能合约并与之交互&#xff0c;那么本指南适合你。…

大数据技术(入门篇)--- 使用Spring Boot 操作 CDH6.2.0 Spark SQL进行离线计算

前言 CDH 6.2.0 搭建的环境&#xff0c;并不能直接使用 spark 相关资源&#xff0c;需要对此服务端环境进行一些修改Spark 目前仅支持 JDK1.8, Java项目运行环境只能使用JDK 1.8我这里使用的是 CDH6.2.0集群&#xff0c;因此使用的依赖为CDH专用依赖&#xff0c;需要先添加仓库…

跨平台开发工具怎么选?IDE工具推荐

软件开发工具链的价值&#xff0c;越来越多企业看到了它。近年来&#xff0c;国内也迎来了软件开发工具的自主化浪潮&#xff0c;今天就来跟大家盘点一下2023年十大移动开发IDE工具。 一、Android Studio 作为Android开发IDE工具的首选&#xff0c;Android Studio提供了一个全…