Unity中的C#與C++互動
原始碼demo
演示了一個渲染三角形的例子
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
引用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);
}
}
相關推薦
Unity中的C#與C++互動
原始碼demo 演示了一個渲染三角形的例子 C++部分程式碼實現了對底層API的封裝以及核心功能實現。 RenderingPlugin.cpp中定義了C++的介面。其中定義了一系列全域性變數,使用者通過介面函式對這些全域性變數賦值。如: 設定紋理
Unity中的C#與C++交互<微信牛牛源碼
ets main rom new ref enume manually apply 渲染 演示了一個渲染三角形的例子 微信牛牛源碼(h5.hxforum.com) 聯系方式170618633533企鵝2952777280 微信Tel17061863533 源碼出售,平臺出租
在 Cef 中實現 C++ 與 JavaScript 互動場景分析
此文已由作者鄧佳佳授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗 本文主要介紹 CEF 場景中 C++ 和 JavaScript 互動(以下簡稱 JS Bridge)中的一些重要節點,包括了 C++/JavaScript 的方法註冊、方法呼叫、回撥管理。以下是一些
在 Mac Webview 中 Objective-c 與 JS 互動
http://blog.eqoe.cn/posts/mac-webview-js-oc.html 本文為您圖文演示如何在 OC 中註冊或執行 JS 函式,以實現網頁與程式的互動。 1. 首先我們建立一個 XCode 專案; 2. 新增WebView 到ViewContro
C++與QML互動2:在QML中呼叫C++特性
版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/
C與C++的函數聲明中省略參數的不同意義
style clu nts 這一 too spa 好奇心 函數聲明 fun 一直都以為C/C++中形如 int func(); 這樣的函數聲明其意義就是一個參數 void(沒有參數)的函數。然而今天在看C++的時候突然看到這麽一句: 對於帶空參數表的函數,
【總結】C++與C#中的static靜態修飾符
this sea const 數據 一切都 UC 限制 有一個 字段 重點 靜態類(sealed+abstract) 靜態構造函數(無參,無限制符,自動執行一次) 靜態變量(類級別,實例無關,靜態存儲區中) 靜態方法(不能被重寫) 靜態局部變量(始終存在) 靜態本質是實
【2018.05.05 C與C++】C++中的自動廢料收集:概念與問題引入
自己 ont 大量 閱讀 帶來 int OS 修改 htm 在閱讀C++語言的設計與演化一書時,作者多次提到希望能設計出一個自動廢料收集,然而出於種種考慮,始終未將自動廢料收集納入標準討論中,而是由Coder自己考慮是否在程序中實現廢料收集。 當然了,許多Java-Code
c與c++中輸出字符指針和字符串指針的問題
cout 指針 inux 問題 執行 格式 一個 輸出 [] 首先搞清楚在c語言中沒有字符串的類型,所以對字符串操作,有兩種形式:可以用字符指針,或者字符串數組(這裏的指針變量c,系統會為其重新分配內存。 c程序示例: 1 #include <stdio.h&g
【C++】C與C++中 const常量 - 修改時報錯
#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &
C#與java互動匯入EXCEL
採用webservice與java互動: 大致思路: 通過C#來獲取檔案, 將檔案讀取為BYTE[] ,然後通過webservice 將其傳入java後代,然後去解析EXCEL; Excel 如下: C#端程式碼:
C++與Lua互動1: C++呼叫lua
lua作為一門動態語言,可用來當做配置檔案和實現經常變化的業務功能,很方便的實現熱更新。同時lua作為一門膠水語言,配合強大的C++作邏輯支撐,程式效能高、開發效率快,猶如珠簾合璧,所向無敵。C++與lua的互動主要通過lua的虛擬棧實現,本文不打算深入講解其
Android JNI中Java與C++物件如何建立一一對應的關係
Android JNI中Java與C++物件如何建立一一對應的關係 環境 系統:Mac OSX IDE:android studio 3.0 1.JAVA物件持有C++物件的指標 在java類中建立long型別的變數如(long mNativeStudent )
Singleton模式在C#與C++中的實現
Singleton應該可以算是GOF的23個模式中最簡單的一個模式了,它有兩個要求:一是保證一個類僅有一個例項;二是提供一個訪問它的全域性訪問點。這在實現中分別對應為:一是建構函式非public;二是提供一個靜態函式作為全域性訪問點。 在C#中,我們可以這麼寫: publicclas
工大助手(C#與python互動)
工大助手(爬蟲——C#與python互動) 基本內容 工大助手(桌面版) 實現登陸、查成績、計算加權平均分等功能 團隊人員 13070046 孫宇辰 13070003 張帆 13070004 崔巍 13070006 王奈 13070002 張雨帆 13070045 汪天米 工大教務爬蟲編寫(C#與py
const在C與C++中的區別
在C中,const不是常量,只能說是一個不能改變的變數(注意是變數),C編譯器不能把const看成看成一個編譯期間的常量,因為他在記憶體中有分配,C編譯器不知道他在編譯期間的值。所以不能作為陣列定義時的下標,因為它必須為常量。 在C中,const int a;是可以的,因為這只是宣告一個變數,告訴編
Unity3D中js與C#之間相互呼叫的解決辦法
轉載自:http://www.manew.com/3102.html Unity3D中一些指令碼的方法只能用在JS中,在C#中是無效的,而C#可以與伺服器端通訊,JS本身卻不行。而且,如果需要用到js呼叫c#的問題,js會比c#先編譯,所以在mac裡編譯ios的時候會出錯,
Python格式化中使用%與C prinf格式輸出的區別
一.格式 1.1 C printf()的一般格式 printf(格式控制,輸出列表); 例:int i = 3; double f = 4.56; printf("%d,%f", i,f); 1.2 PYTHON 格式化輸出 格式標記字串 % 要輸出的值組
NDK學習:C與C++在Ndk中的區別
使用C++做ndk 某些程式碼簡單一些原因是 他給你封裝了一個 env結構體 #include<stdio.h> #include"cn_itcast_cpp_DemoActivity.h" #include <android/log.h> #inc
C與C++中的static的關鍵詞的作用
這裡分成兩個方面來講: 1.對於C語言 原則一:只用進行一次初始化 但是有一個原則必須講,static所儲存的位置: 還是把一個程序進行的位置放出: .text:指的是程式碼段 .data和.bss是我們要重點討論的段: 這兩個段儲存著我們全域