Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGL :: Расшаривание ресурсов [РЕШЕНО]

OpenGL :: Расшаривание ресурсов [РЕШЕНО]

Страницы: 1 2 3 Следующая »
Daniil PetrovПостоялецwww13 мар. 201821:09#0
Долгое время перепроверял весь код, так пока и не понял, в чём загвоздка. Почему-то страдает текстура последнего загружаемого в очереди объекта. Если добавить в конец очереди объект, чума переходит на него.
Выводятся то артефакты, то чёрный цвет, то вместо всей текстуры, то вместо некоторых MIP-уровней, то выводятся MIP-уровни другой текстуры.

Изображение удалено

Появилось после того, как выкинул всю загрузку в другой поток. Данная проблема была даже тогда, когда текстуры из RAM в видеокарту загружались в главном потоке.
Экземпляры всех классов стали храниться в std::map вместо std::vector. Ни CodeXL, ни glGetError ошибок не выдают. У кого-нибудь есть домыслы, в чём может быть причина?

Правка: 13 мар. 2018 21:22

dmitryhryppaПостоялецwww13 мар. 201822:36#1
Daniil Petrov
> Появилось после того, как выкинул всю загрузку в другой поток.
GL просто так в потоки не умеет, вроде как.
https://www.khronos.org/opengl/wiki/OpenGL_and_multithreading

Правка: 13 мар. 2018 22:37

innuendoПостоялецwww13 мар. 201822:49#2
надоело
ronnikoПостоялецwww13 мар. 201822:55#3
Пиши свой АЙПИ !
А вообще на табуретке все нормально с текстурой. Этого вполне достаточно.

Правка: 13 мар. 2018 22:57

/A\Постоялецwww13 мар. 201823:40#4
Daniil Petrov
> Почему-то страдает текстура последнего загружаемого в очереди объекта.
Может надо биндить нулевую текстуру после загрузки?
А то похоже, что где-то в другом месте происходит модификация этой текстуры, поэтому никаких ошибок. Такое бывает при неправильном кэшировании состояний.
nonamezeroxПостоялецwww14 мар. 20180:00#5
Daniil Petrov
> Появилось после того, как выкинул всю загрузку в другой поток.
Поэтому и получилось - OGL не предназначен для многопоточной работы.
Daniil PetrovПостоялецwww14 мар. 20181:49#6
dmitryhryppa
> GL просто так в потоки не умеет, вроде как.

nonamezerox
> Поэтому и получилось - OGL не предназначен для многопоточной работы.

> Данная проблема была даже тогда, когда текстуры из RAM в видеокарту загружались в главном потоке.
От того, что они стали полностью грузиться в другом потоке, ничего не изменилось, с потоками всё в порядке.
Все шейдерные программы грузятся без проблем, все VBO грузятся без проблем, текстуры в принципе тоже, косяк в чём-то другом.
> Почему-то страдает текстура последнего загружаемого в очереди объекта. Если добавить в конец очереди объект, чума переходит на него.
Не расшариваются только контейнеры, поэтому оборачивать VBO в VAO приходится в основном потоке.

/A\
> Может надо биндить нулевую текстуру после загрузки?
Так и делается.

> Такое бывает при неправильном кэшировании состояний.
Попробую открыжить этот момент.

Правка: 14 мар. 2018 2:23

Daniil PetrovПостоялецwww14 мар. 20188:19#7
Что самое интересное, такой же косяк был и с последним в очереди загружаемым звуковым источником. Он то воспроизводился, то нет.
Теперь воспроизводится с регулярной завистью, а из-за чего так стало, я так не понял.
war_zesПостоялецwww14 мар. 20189:56#8
innuendo
> надоело
зато в DX11 таких вопросов не возникает.
innuendoПостоялецwww14 мар. 201810:02#9
war_zes
> зато в DX11 таких вопросов не возникает.

не начинай

ronnikoПостоялецwww14 мар. 201811:10#10
В Unity точно такого не бывает !
AndreyПостоялецwww14 мар. 201811:30#11
Daniil Petrov
> Появилось после того, как выкинул всю загрузку в другой поток.
> У кого-нибудь есть домыслы, в чём может быть причина?
> текстуры в принципе тоже, косяк в чём-то другом.
>> Может надо биндить нулевую текстуру после загрузки?
> Так и делается.
Пока не загрузилась полностью текстура в другом потоке через набор функций: glGenTextures/ glBindTexture/ glTextureXD/glCompressedTexImageXD/glTextureStorageXD/glCompressedtexSubImageXD), нельзя ее биндить в потоке рендера, синхронизщаруй эти операции объектами синхронизации и все будет работать.
innuendoПостоялецwww14 мар. 201811:37#12
Andrey
> синхронизщаруй эти операции объектами синхронизации и все будет работать.

есть более простое решение - не использовать рендер из другого потока

ronnikoПостоялецwww14 мар. 201812:04#13
Daniil Petrov не знаю как на счет текстур. А вот на табуретке точно не хватает мужика с балалайкой !
http://www.treda.ru/i/photos/b/67/f8c88c72795a2d120a8526cc43fee8e5.jpg
Daniil PetrovПостоялецwww14 мар. 201812:20#14
Andrey
> Пока не загрузилась полностью текстура в другом потоке через набор функций: glGenTextures/ glBindTexture/ glTextureXD/glCompressedTexImageXD/glTextureStorageXD/glCompressedtexSubImageXD), нельзя ее биндить в потоке рендера, синхронизщаруй эти операции объектами синхронизации и все будет работать.
Объект, использующий какие-либо ресурсы, добавляется в очередь на рендеринг только после их полной загрузки. Пока модели, текстуры и шейдерные программы загружаются, у рендера к ним нет никакого доступа.

ronniko
> не знаю как на счет текстур. А вот на табуретке точно не хватает мужика с балалайкой !
Водки с селёдкой на газетке на ней не хватет и бабы, с которой можно выпить и оттянуться :)))

Правка: 14 мар. 2018 12:21

Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Графика

Тема закрыта.

2001—2018 © GameDev.ru — Разработка игр