可以更改OpenGL纹理名称吗?

时间:2014-12-12 17:15:54

标签: plugins unity3d

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

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

是否可以使Unity纹理指向我的纹理?我是低级OpenGL的超级粗糙。

或者:是否可以从已存在的openGL纹理创建Texture2D?然后我可以创建自己的纹理并将其交回到Unity以包裹Texture2D。

我知道我可以将纹理中的数据复制到Unity纹理,但是当两者的数据已经存在于GPU上时,这非常缓慢且效率低下。我正在研究FBO副本,但是当我只想指针A指向指针B指向的同一个东西(理论上是任何方式)时,所有这些看起来都有点过头了......

1 个答案:

答案 0 :(得分:0)

#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;
    }
}

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

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