`
schi
  • 浏览: 204758 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Maya plugin with OpenCL C++ example

阅读更多
GPU, Python and Maya使用的是python和pyopencl,这次我们使用C++来实现。

在GPU上面运行的kerne代码
// kerne code
const char kerneSrc[] = "#pragma OPENCL EXTENSION cl_khr_fp64: enable\n"
"__kernel void ytwist(__global const double4 *pos,\n"
"__global double4 *newPos,\n"
"double magnitude,\n"
"float envelope)\n"
"{\n"
"    int gid = get_global_id(0);\n"
"    newPos[gid] = pos[gid];\n"
"    float ff = magnitude * pos[gid].y * envelope;\n"
"    if (ff != 0.f)\n"
"    {\n"
"        float cct = cos(ff);\n"
"        float cst = sin(ff);\n"
"        newPos[gid].x = pos[gid].x * cct - pos[gid].z * cst;\n"
"        newPos[gid].z = pos[gid].x * cst + pos[gid].z * cct;\n"
"    }\n"
"}";

对比python的版本你会发现有点不一样,python的版本使用的float和float4,而这次我们使用double和double4,为了能使用double类型,我们需要OpenCL启动对double的支持
#pragma OPENCL EXTENSION cl_khr_fp64: enable


因为我们使用的是OpenCL的c++蒙板,为了能捕捉错误需要
#define __CL_ENABLE_EXCEPTIONS


查询并选择一个平台
// find a opencl platform
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
if (platforms.size() == 0)
{
    MGlobal::displayError("Platform size 0");
    return MS::kFailure;
}

什么是平台(platform)?
在桌面电脑上是Nvidia,AMD,Intel。

创建context,因为我们需要的是GPU,所以使用CL_DEVICE_TYPE_GPU
// create a context
cl_context_properties properties[] = { CL_CONTEXT_PLATFORM,
                                       (cl_context_properties)(platforms[0])(), 
                                       0 };
cl::Context context(CL_DEVICE_TYPE_GPU, properties);


获取所有显卡设备
// get devices
std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();


从kernel代码创建GPU程序并生成
// create a program
cl::Program::Sources source(1, std::make_pair(kerneSrc, strlen(kerneSrc)));
cl::Program program(context, source);
program.build(devices);


获取所有的顶点位移,这里我使用的是cl_double4类型,它是OpenCL里定义的,但需要注意的是它在GNUC编译器下才跟maya里的MPoint的一样可以使用x,y,z,w属性,而在MSVC却只能使用s[i]的形式
// position data
int numPoints = iter.count();
cl_double4 *allPos = new cl_double4[numPoints];
cl_double4 *outPos = new cl_double4[numPoints];

// iterate through each point in the geometry
// get all position data
int i = 0;
for (; !iter.isDone(); iter.next()) {
    MPoint pt = iter.position();
    #if defined(__GNUC__)
    allPos[i].x = pt.x;
    allPos[i].y = pt.y;
    allPos[i].z = pt.z;
    allPos[i].w = pt.w;
    #else
    // for MSVC
    allPos[i].s[0] = pt.x;
    allPos[i].s[1] = pt.y;
    allPos[i].s[2] = pt.z;
    allPos[i].s[3] = pt.w;
    #endif

    i++;
}


创建GPU内存对象,并把数据传到GPU内存上
// create buffers
cl::Buffer posBuffer = cl::Buffer(context,
    CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
    numPoints * sizeof(cl_double4), allPos);
cl::Buffer nposBuffer = cl::Buffer(context,
    CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR,
    numPoints * sizeof(cl_double4), outPos);


创建我们的kernel,并设置kernel需要的参数,kernel可以理解为GPU程序里面的一个函数
// create a kernel
cl::Kernel kernel(program, "ytwist", &err);
// set kernel argmuments
kernel.setArg(0, posBuffer);
kernel.setArg(1, nposBuffer);
kernel.setArg(2, magnitude);
kernel.setArg(3, env);


创建commandQueue,并执行我们的kernel,kernel只能通过commandQueue来执行,线程数也是通过commandQueue来指定的
// create a command queue
cl::Event event;
cl::CommandQueue queue(context, devices[0], 0, &err);
// execut the kernel
queue.enqueueNDRangeKernel(kernel,
    cl::NullRange,
    cl::NDRange(numPoints),
    cl::NullRange,
    NULL,
    &event);
event.wait();


所有线程都运行完了,我们需要把数据从GPU内存读回来,然后再设置所有的顶点位置。
// read the data back
queue.enqueueReadBuffer(nposBuffer, CL_TRUE, 0, numPoints * sizeof(cl_double4), outPos);

// set the new positions
i = 0;
iter.reset();
for (; !iter.isDone(); iter.next()) {
    MPoint pt = iter.position();
    #if defined(__GNUC__)
    pt.x = outPos[i].x;
    pt.z = outPos[i].z;
    #else
    pt.x = outPos[i].s[0];
    pt.z = outPos[i].s[2];
    #endif
    iter.setPosition(pt);
    i++;
}


完整的代码
https://github.com/mackst/myRandomStuff/tree/master/plugins/yTwistNode_ocl
分享到:
评论

相关推荐

    VS2010——MayaPluginWizard2.0不能用的解决方法

    在开发Autodesk Maya的插件时,Visual Studio (VS) 2010是一个常见的集成开发环境(IDE),而MayaPluginWizard 2.0是一个非常实用的工具,用于简化和自动化创建Maya插件的过程。然而,有时用户可能会遇到MayaPlugin...

    C++ Rendering Plugin example for Unity.zip

    这个"C++ Rendering Plugin example for Unity.zip"文件很可能包含了一个示例项目,展示了如何构建和集成C++代码到Unity中,以优化游戏或应用的视觉效果。以下是关于C++渲染插件在Unity中的应用和实现的关键知识点:...

    plugin-architecture-example.zip_c++ 插件模式_m_LoadedPlugins_插件_插件架构

    在C++编程中,插件架构是一种设计模式,它允许应用程序在运行时动态加载和卸载功能模块,这些模块称为“插件”。这种模式对于扩展软件功能、保持核心代码的简洁性和灵活性至关重要。本示例将详细介绍如何实现一个C++...

    Flatstyle-plugin for c++builder

    【Flatstyle-plugin for C++Builder】是一个专为C++Builder开发者设计的插件,它引入了一种扁平化的设计风格,使应用程序的用户界面(UI)看起来更加现代、简洁和时尚。C++Builder是一款强大的集成开发环境(IDE),...

    vuepress-plugin-vue-example:一个Vuepress插件,可在文档内部显示Vue组件的实时示例和源代码

    vuepress-plugin-vue-example 一个Vuepress插件,用于在文档内部显示Vue组件的实时示例和源代码。 特征 易于使用,只需在.md或.vue文件中使用一个vue-example标记 使用Vuepress的内置语法突出显示功能 显示完整的...

    eclipse c++代码格式化

    Eclipse 是一个强大的集成开发环境(IDE),支持多种编程语言,包括C++。在编写C++代码时,保持代码风格的一致性和可读性是非常重要的,这就需要用到代码格式化工具。"eclipse c++ 代码格式化" 主题涉及到Eclipse中...

    Deadline_Plugin5.2 for maya 2014

    **Deadline 插件5.2 for Maya 2014详解** 在计算机图形学和动画制作领域,Maya是一款广泛使用的3D建模、动画、模拟和渲染软件,而Deadline是一款强大的分布式渲染管理工具,它能够高效地管理和调度大规模的渲染任务...

    基于C++快速使用TensorRT来部署模型项目源码

    本项目源码以C++为基础,教你如何快速利用TensorRT来部署模型,实现高效的计算性能。 首先,TensorRT的核心功能是构建一个高效的执行图,通过解析ONNX(Open Neural Network Exchange)或TensorFlow、PyTorch等框架...

    DynObj - C++ Cross Platform Plugin Objects

    DynObj is an open source library that provides a C++ application with run-time class loading facilities (AKA plugins). It's written in standard C++, and can be used with any C++ compiler with good ...

    UE4 plugin example.pdf

    UE4插件开发示例ppt,国外开发者提供的插件示例讲解ppt,对于想使用 Unreal Engine 4 开发的同学会有帮助。

    plugin example

    "plugin example" 提供了一个很好的学习平台,让我们深入理解插件系统的设计与实现。 插件系统的核心优势在于其维护性和扩展性。维护性意味着当需要修复错误或更新特定功能时,我们可以在不干扰主程序运行的情况下...

    Prentice.Hall.C++.GUI.Programming.with.Qt.4.2nd.Edition.2008.chm

    Integrating C++ Components with Qt Jambi Appendix D. Introduction to C++ for Java and C# Programmers Getting Started with C++ Main Language Differences The Standard C++ Library About the ...

    kettle执行hive相关ktr时报错: database type with plugin id [HIVE2] couldn't be found!

    java代码执行hive相关ktr时报错: database type with plugin id [HIVE2] couldn't be found! 解决:kettle-core-7.1.0.0-12.jar适配hive后的包。具体步骤请查看...

    Bcc32Pch IDE Plugin for C++ Builder 5/6/10

    A plugin for C++Builder 5/6 and BDS 2006. It replaces the IDE compiler by the commandline tools and improves the compilation speed.

    c++ plugin 框架 sample

    在IT行业中,C++插件框架是一个至关重要的概念,它允许开发者通过动态加载代码来扩展应用程序的功能,而无需重新...通过深入研究和实践“c++ plugin框架sample”,你将能够掌握创建高效、可扩展的应用程序的关键技术。

    Windows-VirtualDub-Plugin-BlackWhite-master_C++_visualc++_MFC_

    本篇将深入探讨名为"Windows-VirtualDub-Plugin-BlackWhite-master"的C++项目,该项目是为VirtualDub设计的一个BlackWhite/Dithered插件的源码,主要涉及C++编程语言、Visual C++编译环境以及Microsoft Foundation ...

    MAYA-Plugin-DcBoo.rar

    《MAYA布林运算插件DcBoo深度解析》 在三维动画制作领域,MAYA无疑是业界广泛使用的顶级软件之一。它的强大功能和灵活性使得艺术家们能够创造出令人惊叹的视觉效果。然而,即便如此,对于某些特定的需求,如复杂的...

    plugin_example.tar.gz

    “plugin_example.tar.gz”是一个压缩包文件,其中包含的“plugin_example”很可能是ANSA插件的源代码或者可执行文件。在解压这个文件后,我们可以看到插件的具体实现,包括可能的.C或.F90等源代码文件,或者是编译...

    Dual Quaternion Skinning Maya Plugin-开源

    【标题】"Dual Quaternion Skinning Maya Plugin-开源"所涉及的知识点主要集中在三维动画软件Maya的插件开发以及双四元数在蒙皮技术中的应用。双四元数蒙皮是一种高级的骨骼绑定技术,它能提供比传统蒙皮方法更平滑...

    Dev-C++ 6.0(更名为Smart-C++ 1.2.5.174)

    【Smart-C++ 1.2.5.174】是一款基于Dev-C++ 5.3.0.2深度改造的C++集成开发环境(IDE),特别针对编程竞赛进行了优化。这款IDE旨在提供一个高效、易用的平台,助力程序员在编程竞赛中快速编写、调试和优化代码。...

Global site tag (gtag.js) - Google Analytics