【问题标题】:Possible to change OpenGL texture name?可以更改 OpenGL 纹理名称吗?
【发布时间】:2016-01-24 02:03:35
【问题描述】:

我正在使用 Unity 的渲染插件示例。

Unity 调用插件并交给它一个纹理指针,这是一个 OpenGL 纹理名称(SetTextureFromUnity 函数供参考)。我在我的插件中创建和管理另一个纹理。我想以某种方式让 Unity 的纹理参考使用我的纹理,而不是它交给我的纹理。

是否可以让 Unity 纹理只指向我的纹理?我对低级 OpenGL 非常粗鲁。

或者:是否可以从已经存在的 openGL 纹理创建 Texture2D?然后我可以创建自己的纹理并将其交还给 unity 以使用 Texture2D 进行包装。

我知道我可以将数据从我的纹理复制到 Unity 纹理,但是当两者的数据都已经在 GPU 上时,这会非常缓慢且效率低下。我正在研究 FBO 副本,但是当我只想让指针 A 指向与指针 B 指向的东西相同的东西(理论上任何方式)时,所有这些似乎都过大了......

【问题讨论】:

  • 我正在研究类似的东西,我目前正在尝试的是:在渲染方法之一(OnPreRender() 和这样的)。然后插件获取这个指针并使用GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, <texture pointer>)GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);bitmap 加载到纹理中。但是它目前不工作。
  • 你有没有找到任何可行的方法?尝试实现类似的东西。

标签: plugins unity3d


【解决方案1】:
#define SIZE 1024
#define MASK (SIZE - 1)
struct texture
{
    my_image_object *image;
};

struct texture table[SIZE];

void
bind_my_image_object(my_image_object *image)
{
    uintmax_t hash;
    size_t    index;

    hash    = my_pointer_hash_function((uintptr_t)image);
    index   = hash & MASK;
    texture = table + index;

    glBindTexture(GL_TEXTURE_2D, index);

    if (texture->image != image)
    {
        your_texture_upload_routine(image);
        texture->image = image;
    }
}

使用合适的哈希函数。向下移动指针值以避免考虑散列函数中的典型对象对齐。例如:(uintptr_t)image >> 3 在 64 位 PC 上。并使用一张足够大的桌子,这样你就不会在每一帧都浪费你的纹理。还要使用 2 的幂的表格大小,以便 hash & MASK 正确换行。

一般哈希表建议适用。您的哈希表可能会有所不同。

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2017-08-14
    • 2011-05-31
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多