Про открытости и текстуру на андроид
Как мы знаем, в OpenGL ES класс Renderer
на андроиде есть 3 function:onDrawFrame, onSurfaceChanged, onSurfaceCreated.
и мы можем загрузить текстуру в onSurfaceCreated и onDrawFrame. Я хочу знать, могу ли я загрузить текстуру до "Renderer". Также у меня есть класс с именем "Map", и я могу загрузить текстуру изображений в "Map" до создания "GLSurfaceView". или я могу загрузить текстуру изображений перед функциями "onSurfaceCreated" и "onDrawFrame".
если кто-то знает это, пожалуйста, помогите мне.
Спасибо!!
1 ответ
Не легко. Но (почти) все возможно.
Здесь важно понять, что вызовы OpenGL работают в текущем контексте. Прежде чем вы сможете делать какие-либо вызовы OpenGL, вам нужно создать контекст и сделать его текущим. Текущий контекст применяется к потоку, поэтому разные потоки могут иметь разные текущие контексты. Я не думаю, что четко определено, что произойдет, если вы попытаетесь сделать вызовы OpenGL без текущего контекста, но это, безусловно, не является чем-то полезным. Наиболее вероятными исходами будут ничто или крах.
GLSurfaceView
обрабатывает все сложности настройки контекстов для вас. Он создает поток рендеринга, который выполняется независимо от основного потока (UI), создает контекст и делает этот контекст текущим в потоке рендеринга. Однажды методы на вашем GLSurfaceView.Renderer
Реализация вызывается, у вас уже есть текущий контекст, и вы готовы делать вызовы OpenGL.
Теперь, если вы хотите сделать вызовы OpenGL до всего этого GLSurfaceView
случается волшебство, ты должен сделать это много сам. Вы можете вызывать методы класса EGL14, чтобы создать собственный контекст и сделать его текущим. Это немного больно, но не очень сложно. У меня нет полного кода под рукой, но вы должны быть в состоянии найти примеры или выяснить это из документации. Вы будете использовать такие методы, как eglChooseConfig()
, eglCreateContext()
, eglMakeCurrent()
и, вероятно, еще немного в пути.
Как только вы закончите с этим, вы можете сделать ваши OpenGL вызовы для создания текстур и т. Д. Но, к сожалению, это еще не все.
Однажды ваш GLSurfaceView
приходит в себя, он будет создавать свой собственный контекст, как обычно. Различные контексты OpenGL могут совместно использовать ресурсы (например, текстуры), но они по умолчанию этого не делают. поскольку GLSurfaceView
ничего не знает о контексте, который вы уже создали, он не будет делиться ресурсами с вашим контекстом.
Чтобы включить совместное использование ресурсов, вы должны вмешиваться в создание контекста GLSurfaceView
, Вы можете сделать это с setEGLContextFactory
метод. Это позволяет вам подключить свое собственное создание контекста для GLSurfaceView
где вы можете теперь создать контекст, который разделяет ресурсы с контекстом, который вы создали ранее и использовали для загрузки текстуры.