python_opengl

使用python调用opengl进行渲染 import glfw from OpenGL.GL import * def main(): # Initialize the library if not glfw.init(): return # Create a windowed mode window and its OpenGL context window = glfw.create_window(640, 480, "Hello World", None, None) if not window: glfw.terminate() return # Make the window's context current glfw.make_context_current(window) count =0; # Loop until the user closes the window while not glfw.window_should_close(window): # Render here, e.g. using pyOpenGL glClearColor(0.2, 0.3, 0.3, 1.0) glClear(GL_COLOR_BUFFER_BIT) glColor3f(1.0, 1.0, 1.0) glBegin(GL_TRIANGLES) glVertex3f(-0.5, -0.5, 0.0) glVertex3f(0.5, -0.5, 0.0) glVertex3f(0.0, 0.5, 0.0) glEnd() # Swap front and back buffers glfw.swap_buffers(window) # Poll for and process events glfw.poll_events() glfw.terminate() if __name__ == "__main__": main()

四月 26, 2025

GlSurfaceView源码剖析

应用程序的渲染方式分为两种 按需渲染: 绝大多数应用程序,比如微信/钉钉/QQ,都是这种,当有数据更新才请求重新刷新绘制界面 定频渲染:比如游戏,永远按照固定的频率进行渲染(只有这样,才能模拟出逼真的动画效果) 在android 中,上述两个场景分别用以下两个类 SurfaceView(按需渲染):直接在UI线程进行渲染,效率低,适用于渲染频率低的应用场景。 GLSurfaceView(定频渲染):开启一个独立的opengl线程来进行渲染(防止UI线程被阻塞),每个GLSurfaceView的实例都有一个 GLThread mGLThread 成员 无论是java/C++, opengl绘制流程都一样: 初始化 egl 参数 在一个循环中不断进行帧绘制 类的大体定义如下 public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback2 { private GLThread mGLThread; //独立的opengl线程进行渲染 private Renderer mRenderer; //自定义的Renderer, 这个Render定义了如何进行渲染 ........ public void setRenderer(Renderer renderer) { ......... mRenderer = renderer; mGLThread = new GLThread(mThisWeakRef); mGLThread.start(); //启动opengl线程 } public void queueEvent(Runnable r) { mGLThread.queueEvent(r); } ......... } public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCallback { SurfaceControl mSurfaceControl; // 与android系统的的surfacefinger服务进行binder通讯 public void draw(Canvas canvas){ ..... super.draw(canvas); } } static class GLThread extends Thread { @Override public void run() { setName("GLThread " + getId()); if (LOG_THREADS) { Log.i("GLThread", "starting tid=" + getId()); } try { guardedRun(); } catch (InterruptedException e) { // fall thru and exit normally } finally { sGLThreadManager.threadExiting(this); } } private void guardedRun() throws InterruptedException { ............. Runnable event = null; while(true){ synchronized (sGLThreadManager) { while (true) { if (mShouldExit) { return; } //pop 一个 event if (! mEventQueue.isEmpty()) { event = mEventQueue.remove(0); break; } if (event != null) { event.run(); // 执行event event = null; continue; } ........... // 初始化egl mEglHelper.createGL(); ........... //onSurfaceCreated mRenderer.onSurfaceCreated(gl, mEglHelper.mEglConfig); if(sizeChanged) //如果view大小发生了变化 { //onSurfaceChanged mRenderer.onSurfaceChanged(gl, w, h); } //绘制 mRenderer.onDrawFrame(gl); ........... } } } } } 自定义Render类 ...

四月 21, 2025 · (updated 四月 23, 2025)