您可以从 iOS C 插件 "on the spot" 写入 Unity 纹理吗?
Can you write to a Unity texture, from an iOS C plugin, "on the spot"?
假设您有一个用于 iOS、
的低级 Unity 插件
所以在 c#
using System.Runtime.InteropServices;
using AOT;
public class Teste: MonoBehaviour {
[DllImport("__Internal")] private static extern
void set_texture_from_unity(System.IntPtr texture, int w, int h);
有一个纹理,.Apply()
它,然后将指针发送给原生iOS插件:
public void ClickPassTexture() {
tex = new Texture2D(256, 256, TextureFormat.ARGB32, false);
tex.filterMode = FilterMode.Point;
tex.Apply(); // ACTUALLY UPLOAD TO GPU
someMaterial.mainTexture = tex;
set_texture_from_unity(
tex.GetNativeTexturePtr(), tex.width, tex.height);
}
现在是 C 代码。
用几条彩色线条制作纹理,并将其写入Unity纹理。
#include <OpenGLES/ES2/gl.h>
...
void set_texture_from_unity(void *g_TextureHandle, int w, int h)) {
// make a texture with a few gray rows
unsigned char* data = malloc( g_TextureWidth * 4 * g_TextureHeight );
for (int i = 0; i < 1000; ++i) { data[i] = 100; }
// now, write that to the texture pointer given to us from Unity
GLuint gltex = (GLuint)(size_t)(g_TextureHandle);
glBindTexture(GL_TEXTURE_2D, gltex);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
g_TextureWidth, g_TextureHeight, GL_RGBA, GL_UNSIGNED_BYTE, data);
free(data);
所以,在C代码中,我们貌似已经成功修改了纹理tex
。
但是
它没有出现在屏幕上。
图像显示完全没有实现任何目标。
优秀的 Unity doco docs.unity3d.com/Manual/NativePluginInterface.html
给出了一个示例,其中 C 纹理更改被调用 通过 Unity 渲染链中的回调。
但是
我们可以简单地让 Unity “现在”使用新纹理吗?
我们什么时候想?
我认为这可能会奏效:
set_texture_from_unity( tex.GetNativeTexturePtr(),
tex.width, tex.height);
// the plugin has changed the texture...
// perhaps an Apply will change it on screen?!
tex.Apply();
但是没有! (如果您在 .Apply
之前等待几帧,这没有什么区别。)
你认为.Apply
会再次将纹理发送到gpu,但它似乎不起作用。
简而言之,在 C 插件运行后,如何处理呈现的代码,使其“立即”显示新纹理??
当你知道 C 插件修改了一个纹理时,iOS,如何让 Unity 显示更改???
您需要调用UpdateExternalTexture方法。
Updates Unity texture to use different native texture object.
This function is mostly useful for native code plugins that create
platform specific texture objects outside of Unity, and need to use
these textures in Unity Scenes. For a texture created with
CreateExternalTexture, this function switches to another underlying
texture object if/when it changes.
“新”Unity 中的解决方案
来自 Unity Japan 的(传奇)Keijiro Takahashi 发布了可能是 Unity 发布的最重要的内容:
https://github.com/keijiro/TextureUpdateExample
(new)逐帧样式纹理更新的实际示例来自插件。
并且它适用于 IOS
再次强调,这几乎是 Unity 发出的最有价值的东西!呸!
关于你问的问题,我还真没找到解决办法
假设您有一个用于 iOS、
的低级 Unity 插件所以在 c#
using System.Runtime.InteropServices;
using AOT;
public class Teste: MonoBehaviour {
[DllImport("__Internal")] private static extern
void set_texture_from_unity(System.IntPtr texture, int w, int h);
有一个纹理,.Apply()
它,然后将指针发送给原生iOS插件:
public void ClickPassTexture() {
tex = new Texture2D(256, 256, TextureFormat.ARGB32, false);
tex.filterMode = FilterMode.Point;
tex.Apply(); // ACTUALLY UPLOAD TO GPU
someMaterial.mainTexture = tex;
set_texture_from_unity(
tex.GetNativeTexturePtr(), tex.width, tex.height);
}
现在是 C 代码。
用几条彩色线条制作纹理,并将其写入Unity纹理。
#include <OpenGLES/ES2/gl.h>
...
void set_texture_from_unity(void *g_TextureHandle, int w, int h)) {
// make a texture with a few gray rows
unsigned char* data = malloc( g_TextureWidth * 4 * g_TextureHeight );
for (int i = 0; i < 1000; ++i) { data[i] = 100; }
// now, write that to the texture pointer given to us from Unity
GLuint gltex = (GLuint)(size_t)(g_TextureHandle);
glBindTexture(GL_TEXTURE_2D, gltex);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
g_TextureWidth, g_TextureHeight, GL_RGBA, GL_UNSIGNED_BYTE, data);
free(data);
所以,在C代码中,我们貌似已经成功修改了纹理tex
。
但是
它没有出现在屏幕上。
优秀的 Unity doco docs.unity3d.com/Manual/NativePluginInterface.html
给出了一个示例,其中 C 纹理更改被调用 通过 Unity 渲染链中的回调。
但是
我们可以简单地让 Unity “现在”使用新纹理吗?
我们什么时候想?
我认为这可能会奏效:
set_texture_from_unity( tex.GetNativeTexturePtr(),
tex.width, tex.height);
// the plugin has changed the texture...
// perhaps an Apply will change it on screen?!
tex.Apply();
但是没有! (如果您在 .Apply
之前等待几帧,这没有什么区别。)
你认为.Apply
会再次将纹理发送到gpu,但它似乎不起作用。
简而言之,在 C 插件运行后,如何处理呈现的代码,使其“立即”显示新纹理??
当你知道 C 插件修改了一个纹理时,iOS,如何让 Unity 显示更改???
您需要调用UpdateExternalTexture方法。
Updates Unity texture to use different native texture object.
This function is mostly useful for native code plugins that create platform specific texture objects outside of Unity, and need to use these textures in Unity Scenes. For a texture created with CreateExternalTexture, this function switches to another underlying texture object if/when it changes.
“新”Unity 中的解决方案
来自 Unity Japan 的(传奇)Keijiro Takahashi 发布了可能是 Unity 发布的最重要的内容:
https://github.com/keijiro/TextureUpdateExample
(new)逐帧样式纹理更新的实际示例来自插件。
并且它适用于 IOS
再次强调,这几乎是 Unity 发出的最有价值的东西!呸!
关于你问的问题,我还真没找到解决办法