菜鸟教程小白 发表于 2022-12-12 10:14:07

c# - 将 uintptr_t 转换为 id<MTLTexture>


                                            <p><p>我想创建一个简单的 iOS 插件,它可以将纹理绘制到统一的 Texture2D。我已经通过 CreateExternalTexture() 和 UpdateExternalTexture() 完成了它,它工作正常,但我很好奇我是否可以直接从 iOS 端填充 Unity 纹理。这是我的 iOS 插件代码:</p>

<pre><code>//
//testTexturePlugin.m
//Unity-iPhone
//
//Created by user on 18/01/16.
//
//

#import &lt;OpenGLES/ES2/gl.h&gt;
#import &lt;OpenGLES/ES2/glext.h&gt;
#import &lt;UIKit/UIKit.h&gt;

#include &#34;UnityMetalSupport.h&#34;

#include &lt;stdlib.h&gt;
#include &lt;stdint.h&gt;

static UIImage* LoadImage()
{
    NSString* imageName = @&#34;logo&#34;; //;
    NSString* imagePath = [ pathForResource: imageName ofType: @&#34;png&#34;];

    return ;
}

// you need to free this pointer
static void* LoadDataFromImage(UIImage* image)
{
    CGImageRef imageData    = image.CGImage;
    unsigned   imageW       = CGImageGetWidth(imageData);
    unsigned   imageH       = CGImageGetHeight(imageData);

    // for the sake of the sample we enforce 128x128 textures
    //assert(imageW == 128 &amp;&amp; imageH == 128);

    void* textureData = ::malloc(imageW * imageH * 4);
    ::memset(textureData, 0x00, imageW * imageH * 4);

    CGContextRef textureContext = CGBitmapContextCreate(textureData, imageW, imageH, 8, imageW * 4, CGImageGetColorSpace(imageData), kCGImageAlphaPremultipliedLast);
    CGContextSetBlendMode(textureContext, kCGBlendModeCopy);
    CGContextDrawImage(textureContext, CGRectMake(0, 0, imageW, imageH), imageData);
    CGContextRelease(textureContext);

    return textureData;
}

static void CreateMetalTexture(uintptr_t texRef, void* data, unsigned w, unsigned h)
{
#if defined(__IPHONE_8_0) &amp;&amp; !TARGET_IPHONE_SIMULATOR

    NSLog(@&#34;texRef iOS = %lu&#34;, texRef);

    id&lt;MTLTexture&gt; tex = (id&lt;MTLTexture&gt;)(size_t)texRef;

    MTLRegion r = MTLRegionMake3D(0, 0, 0, w, h, 1);
    ;

#else

#endif
}

extern &#34;C&#34; void FillUnityTexture(uintptr_t texRef)
{
    UIImage*    image       = LoadImage();
    void*       textureData = LoadDataFromImage(image);

    if (UnitySelectedRenderingAPI() == apiMetal)
      CreateMetalTexture(texRef, textureData, image.size.width, image.size.height);

    ::free(textureData);
}
</code></pre>

<p>这是 Unity 代码:</p>

<pre><code>using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;

public class TextureHandler : MonoBehaviour {

   
    private Renderer _mesh;

    private Texture2D _meshTexture;

   
    private static extern void FillUnityTexture(IntPtr texRef);

    void Start () {

      _meshTexture = new Texture2D(200, 200, TextureFormat.ARGB32, false);
      _mesh.material.SetTextureScale (&#34;_MainTex&#34;, new Vector2 (-1, -1));
      _mesh.material.mainTexture = _meshTexture;

      IntPtr texPtr = _meshTexture.GetNativeTexturePtr();
      Debug.Log(&#34;texPtr Unity = &#34; + texPtr);

      FillUnityTexture(texPtr);
    }
}
</code></pre>

<p>Unity 纹理上的指针正确地传递给 iOS 插件,我检查了。但是我在 iOS 插件的这一行中遇到了崩溃:</p>

<pre><code>;
</code></pre>

<p>我很确定我有这个问题是因为将 Unity 纹理 (uintptr_t) 上的指针错误地转换为 Metal 纹理 (id)。</p>

<p>所以我的问题是 - 如何正确地将指向纹理的指针转换为 MTLTexture? </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我想您应该阅读有关 ARC 的信息。 </p>

<p>您可以使用 <code>__bridge_retained</code> 将新创建的 <code>id<MTLTexture></code> 对象的所有权转移到 <code>uintptr_t</code> 代码。当您想将 <code>uintptr_t</code> 转换回 <code>id<MTLTexture></code> 时,如果您不想将所有权转移回来,请使用 <code>__bridge</code> 或使用 <code>__bridge_transfer</code> 当你这样做时。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - 将 uintptr_t 转换为 id&lt;MTLTexture&gt;,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34854854/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34854854/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - 将 uintptr_t 转换为 id&lt;MTLTexture&gt;