2014-12-12 2 views
3

Я работаю с образцом Rendering Plugin для Unity.Возможно изменение имени текстуры OpenGL?

Unity вызывает плагин и передает ему указатель текстуры, который является именем текстуры OpenGL (функция SetTextureFromUnity для справки). У меня есть другая текстура, которую я создаю и управляю в своем плагине. Я хотел бы как-то получить ссылку на тексту Unity, чтобы использовать мою текстуру вместо той, которая мне на руку.

Возможно ли, чтобы текстура Unity просто указывала на мою текстуру? Я очень груб с низким уровнем OpenGL.

Альтернативно: возможно ли создать Texture2D из текстуры openGL, которая уже существует? Тогда я мог бы просто создать свою собственную текстуру и вернуть ее к единству, чтобы обернуть Texture2D.

Я знаю, что могу копировать данные из моей текстуры в текстуру Unity, но это невероятно медленно и неэффективно, когда данные для обоих уже находятся на графическом процессоре. Я ищу в FBO копии, но все это кажется излишним, когда я просто хочу указатель А указывает на то же самое, что указатель B наведен на (в теории никак) ...

+0

Я смотрю в нечто подобное, то, что я в настоящее время пытаюсь это: Использование Юнити 'Texture2D.GetNativeTexturePtr()', чтобы передать указатель на текстуру в плагине во время одного из методов отображения ('OnPreRender () 'и такие). Затем плагин принимает этот указатель и использует 'GLES20.glBindTexture (GLES20.GL_TEXTURE_2D, <указатель текстуры>)' и 'GLUtils.texImage2D (GLES20.GL_TEXTURE_2D, 0, bitmap, 0);' для загрузки «bitmap» в текстуры. Однако он не работает в настоящее время. – sh3rifme

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

Использовать приличная хэш-функция. Сдвиньте значение указателя, чтобы избежать типичного выравнивания объекта в вашей хэш-функции. например, (uintptr_t)image >> 3 на 64-битном ПК. И используйте таблицу достаточно большую, чтобы не тратить текстуру на каждый кадр. Также используйте размер таблицы, который имеет мощность 2, поэтому hash & MASK будет обертываться должным образом.

Общие рекомендации хеш-таблицы применяются. Ваша хэш-таблица может отличаться.

Смежные вопросы