1. 程式人生 > >在iOS上使用OpenGL ES渲染YUV

在iOS上使用OpenGL ES渲染YUV

1)建立OpenGL context
[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];


2)layer設定成不透明
_eaglLayer = (CAEAGLLayer*) self.layer;
_eaglLayer.opaque = YES;


3)建立YUV texture
glGenTextures(1, &m_nTexturePlanarY);
glGenTextures(1, &m_nTexturePlanarU);
glGenTextures(1, &m_nTexturePlanarV);


4)新增shader

GLuint vertexShader = CompileShader(_VERTEX_SHADER_Y_U_V, GL_VERTEX_SHADER);
GLuint fragmentShader = CompileShader(_FRAGMENT_SHADER_Y_U_V, GL_FRAGMENT_SHADER);
glAttachShader(m_nProgramHandle, vertexShader);
glAttachShader(m_nProgramHandle, fragmentShader);


摘錄一段GLSL介紹
OpenGL著色語言(GLSL―OpenGL Shading Language)是用來在OpenGL中著色程式設計的語言,也即開發人員寫的短小的自定義程式,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執行的,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可程式設計型。比如:檢視轉換、投影轉換等。GLSL(GL Shading Language)的著色器程式碼分成2個部分:Vertex Shader(頂點著色器)和Fragment(片斷著色器),有時還會有Geometry Shader(幾何著色器)。負責執行頂點著色的是頂點著色器。它可以得到當前OpenGL 中的狀態,GLSL內建變數進行傳遞。GLSL其使用C語言作為基礎高階著色語言,避免了使用匯編語言或硬體規格語言的複雜性。


5)建立render buffer

glGenRenderbuffers(1, &nColorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, nColorRenderBuffer);


6)建立frame buffer
glGenFramebuffers(1, &nFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, nFrameBuffer);


7)建立viewport
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &nBackingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &nBackingHeight);
glViewport(0, 0, nBackingWidth, nBackingHeight);   
glClearColor(0.0, 0.0, 0.0, 1.0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);