Войти
ПрограммированиеФорумГрафика

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

Страницы: 1 2 3 Следующая »
#0
(Правка: 21:22) 21:09, 13 мар. 2018

Долгое время перепроверял весь код, так пока и не понял, в чём загвоздка. Почему-то страдает текстура последнего загружаемого в очереди объекта. Если добавить в конец очереди объект, чума переходит на него.
Выводятся то артефакты, то чёрный цвет, то вместо всей текстуры, то вместо некоторых MIP-уровней, то выводятся MIP-уровни другой текстуры.

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

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


#1
(Правка: 22:37) 22:36, 13 мар. 2018

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

#2
22:49, 13 мар. 2018

надоело

#3
(Правка: 22:57) 22:55, 13 мар. 2018

Пиши свой АЙПИ !
А вообще на табуретке все нормально с текстурой. Этого вполне достаточно.

#4
23:40, 13 мар. 2018

Daniil Petrov
> Почему-то страдает текстура последнего загружаемого в очереди объекта.
Может надо биндить нулевую текстуру после загрузки?
А то похоже, что где-то в другом месте происходит модификация этой текстуры, поэтому никаких ошибок. Такое бывает при неправильном кэшировании состояний.

#5
0:00, 14 мар. 2018

Daniil Petrov
> Появилось после того, как выкинул всю загрузку в другой поток.
Поэтому и получилось - OGL не предназначен для многопоточной работы.

#6
(Правка: 2:23) 1:49, 14 мар. 2018

dmitryhryppa
> GL просто так в потоки не умеет, вроде как.

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

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

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

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

#7
8:19, 14 мар. 2018

Что самое интересное, такой же косяк был и с последним в очереди загружаемым звуковым источником. Он то воспроизводился, то нет.
Теперь воспроизводится с регулярной завистью, а из-за чего так стало, я так не понял.

#8
9:56, 14 мар. 2018
innuendo
> надоело
зато в DX11 таких вопросов не возникает.
#9
10:02, 14 мар. 2018

war_zes
> зато в DX11 таких вопросов не возникает.

не начинай

#10
11:10, 14 мар. 2018

В Unity точно такого не бывает !

#11
11:30, 14 мар. 2018

Daniil Petrov
> Появилось после того, как выкинул всю загрузку в другой поток.
> У кого-нибудь есть домыслы, в чём может быть причина?
> текстуры в принципе тоже, косяк в чём-то другом.
>> Может надо биндить нулевую текстуру после загрузки?
> Так и делается.
Пока не загрузилась полностью текстура в другом потоке через набор функций: glGenTextures/ glBindTexture/ glTextureXD/glCompressedTexImageXD/glTextureStorageXD/glCompressedtexSubImageXD), нельзя ее биндить в потоке рендера, синхронизщаруй эти операции объектами синхронизации и все будет работать.

#12
11:37, 14 мар. 2018

Andrey
> синхронизщаруй эти операции объектами синхронизации и все будет работать.

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

#13
12:04, 14 мар. 2018

Daniil Petrov не знаю как на счет текстур. А вот на табуретке точно не хватает мужика с балалайкой !
http://www.treda.ru/i/photos/b/67/f8c88c72795a2d120a8526cc43fee8e5.jpg

#14
(Правка: 12:21) 12:20, 14 мар. 2018

Andrey
> Пока не загрузилась полностью текстура в другом потоке через набор функций: glGenTextures/ glBindTexture/ glTextureXD/glCompressedTexImageXD/glTextureStorageXD/glCompressedtexSubImageXD), нельзя ее биндить в потоке рендера, синхронизщаруй эти операции объектами синхронизации и все будет работать.
Объект, использующий какие-либо ресурсы, добавляется в очередь на рендеринг только после их полной загрузки. Пока модели, текстуры и шейдерные программы загружаются, у рендера к ним нет никакого доступа.

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

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

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