Unity中的C#与C++交互<微信牛牛源码

演示了一个渲染三角形的例子 微信牛牛源码(h5.hxforum.com) 联系方式170618633533企鹅2952777280 微信Tel17061863533 源码出售,平台出租,房卡有意者私聊扣Q
C++部分代码实现了对底层API的封装以及核心功能实现。

RenderingPlugin.cpp中定义了C++的接口。其中定义了一系列全局变量,用户通过接口函数对这些全局变量赋值。如: 
设定纹理

// --------------------------------------------------------------------------
// SetTextureFromUnity, an example function we export which is called by one of the scripts.

static void* g_TextureHandle = NULL;
static int   g_TextureWidth  = 0;
static int   g_TextureHeight = 0;

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API SetTextureFromUnity(void* textureHandle, int w, int h)
{
    // A script calls this at initialization time; just remember the texture pointer here.
    // Will update texture pixels each frame from the plugin rendering event (texture update
    // needs to happen on the rendering thread).
    g_TextureHandle = textureHandle;
    g_TextureWidth = w;
    g_TextureHeight = h;
}

Plugin装载与卸载

static IUnityInterfaces* s_UnityInterfaces = NULL;
static IUnityGraphics* s_Graphics = NULL;

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
    s_UnityInterfaces = unityInterfaces;
    s_Graphics = s_UnityInterfaces->Get<IUnityGraphics>();
    s_Graphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent);

    // Run OnGraphicsDeviceEvent(initialize) manually on plugin load
    OnGraphicsDeviceEvent(kUnityGfxDeviceEventInitialize);
}

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload()
{
    s_Graphics->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent);
}

渲染线程的回调函数

static void UNITY_INTERFACE_API OnRenderEvent(int eventID)
{
    // Unknown / unsupported graphics device type? Do nothing
    if (s_CurrentAPI == NULL)
        return;

    DrawColoredTriangle();
    ModifyTexturePixels();
    ModifyVertexBuffer();
}

// --------------------------------------------------------------------------
// GetRenderEventFunc, an example function we export which is used to get a rendering event callback function.

extern "C" UnityRenderingEvent UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API GetRenderEventFunc()
{
    return OnRenderEvent;
}

DrawColoredTriangle是渲染的处理函数,分别针对不同的底层API进行封装,如

RenderAPI_D3D11.cpp
RenderAPI_D3D12.cpp
RenderAPI_OpenGL2.cpp

C#为了调用plugin专门做一层封装,见UseRenderingPlugin.cs

引用dll中的方法

    // We‘ll also pass native pointer to a texture in Unity.
    // The plugin will fill texture data from native code.
#if (UNITY_IPHONE || UNITY_WEBGL) && !UNITY_EDITOR
    [DllImport ("__Internal")]
#else
    [DllImport ("RenderingPlugin")]
#endif
    private static extern void SetTextureFromUnity(System.IntPtr texture, int w, int h);

#if (UNITY_IPHONE || UNITY_WEBGL) && !UNITY_EDITOR
    [DllImport ("__Internal")]
#else
    [DllImport("RenderingPlugin")]
#endif
    private static extern IntPtr GetRenderEventFunc();

调用C++中的SetTextureFromUnity函数

    private void CreateTextureAndPassToPlugin()
    {
        // Create a texture
        Texture2D tex = new Texture2D(256,256,TextureFormat.ARGB32,false);
        // Set point filtering just so we can see the pixels clearly
        tex.filterMode = FilterMode.Point;
        // Call Apply() so it‘s actually uploaded to the GPU
        tex.Apply();

        // Set texture onto our material
        GetComponent<Renderer>().material.mainTexture = tex;

        // Pass texture pointer to the plugin
        SetTextureFromUnity (tex.GetNativeTexturePtr(), tex.width, tex.height);
    }

渲染线程注册C++的回调函数

private IEnumerator CallPluginAtEndOfFrames()
    {
        while (true) {
            // Wait until all frame rendering is done
            yield return new WaitForEndOfFrame();

            // Set time for the plugin
            SetTimeFromUnity (Time.timeSinceLevelLoad);

            // Issue a plugin event with arbitrary integer identifier.
            // The plugin can distinguish between different
            // things it needs to do based on this ID.
            // For our simple plugin, it does not matter which ID we pass here.
            GL.IssuePluginEvent(GetRenderEventFunc(), 1);
        }
    }

原文地址:https://www.cnblogs.com/jkksekmaa/p/8434395.html

时间: 2024-10-31 10:33:55

Unity中的C#与C++交互<微信牛牛源码的相关文章

最强微信牛牛源码搭建教程

最强微信牛牛源码搭建教程 Q 2171793408     http://wowotouba.com/h5 <head>   <meta http-equiv="Content-Type" content="text/html; charset=gbk">   <meta name="google-site-verification" content="PXunD38D6Oui1T44OkAPSLyQtFU

最新微信牛牛源码下载搭建教程

最低配置:linux服务器,系统: CentOS 6.8,内存2G以上,独享5M以上带宽 最新微信牛牛源码QQ:2164097691 地址:h5.hubawl.com <!--{template common/header}--><!--{if $tagname}--><div id="pt" class="bm cl"> <div class="z"> <a href="./&qu

微信PK10源码下载与Redis_NOSQL简介

一.NoSQL入门与概述1.互联网背景下为什么要用NoSQL? 1)单机mysql年代在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付.在那个时候,更多的都是静态网页,动态交互类型的网站不多.微信PK10源码下载QQ:2152876294 网址diguaym.com 上述架构下,我们来看看数据存储的瓶颈是什么? 数据量的总大小 一个机器放不下时数据的索引(B+ Tree)一个机器的内存放不下时访问量(读写混合)一个实例不能承受如果满足了上述1 or 3个,进化...... 2

Android学习笔记(十六)——碎片之间进行交互(附源码)

碎片之间进行交互 点击下载源码 很多时候,一个活动中包含一个或者多个碎片,它们彼此协作,向用户展示一个一致的UI.在这种情况下,碎片之间能进行通信并交换数据十分重要. 1.使用上一篇中创建的同一个项目,在fragment.xml中添加TextView的标识id: android:id="@+id/lblFragment1" 2.在fragment2.xml中添加一个Button,用于与fragment1进行交互: <Button android:id="@+id/btn

WeMall微信商城源码插件大转盘代码详情

WeMall微信商城源码插件大转盘代码是用于商业推广的比较有效的方式,分享了部分比较重要的代码,供技术员学习参考 代码详情地址:http://addon.wemallshop.com/Product/addonList/menu_id/1 或 www.wemallshop.com AdminController.class Php代码   <?php // +---------------------------------------------------------------------

房产众销平台 全民房产经纪人 房产微信营销源码 .net 源码

一.源码特点       房产众销平台源码,全民房产经纪人源码,房产微信营销源码,功能强大,界面美观,有需要的朋友不要错过二.菜单功能       前台页面             1.首页             2.限时特惠             3.在售新房             4.二手房源             5.最新时讯             6.赚佣金             7.微信平台             8.房客             9.搜索        

微信h5牛牛源码出售 手机牛牛搭建图文教程

微信h5牛牛源码出售QQ:2152876294官网http://diguaym.com/h5手机17070838768神兽青龙白虎朱雀玄武凤凰大厅搭建如下: 1. 布局的时候,如果一个元素你想让他的宽高保持一定比例,而不随屏幕变化,宽高设置的时候,使用同一个单位都是CSS3的单位,低版本不兼容 <span style="font-family: Arial, sans-serif; ">1.移动端页面布局,使用相对的数值,不要使用绝对数值,推荐使用%,vw,vh,rem,e

微信熟人牛牛源码安装+人工智能+人机融合

1.群体智能https://h5.hxforum.com基于群体编辑的维基百科.微信熟人牛牛源码安装(h5.hxforum.com) 联系方式170618633533企鹅2952777280 源码出售 房卡出售 后台出租有意者私聊扣扣基于群体开发的开源软件.基于众问众答的知识共享.基于众筹众智的万众创新.基于众包众享的共享经济等等.<规划>提出的群体智能研究方向,实质上正是综合集成研讨厅在人工智能新时代的拓展和深化.它的研究内涵不单是关注精英专家团体,而是通过互联网组织结构和大数据驱动的人工智

微信h5熟人牛牛源码租用程序员和用户

按理来说,真正的忙起来的工程师呢微信h5熟人牛牛源码租用(http://h5.hxforum.com) 联系方式170618633533企鹅2952777280 源码出售 房卡出售 后台出租有意者私聊扣扣,其实也没有太多时间来贵论坛看帖子.而且论坛的帖子水贴太多太多.消极能量也太多.这是第一次,也很可能是唯一一次发帖.只是想说点实话,与君共勉. 1,"后悔选择程序员","程序员找不到女朋友","...."太多消极的帖子充斥着各种论坛,包括这里.这