egl语言java_你还不知道 OpenGL ES 和 EGL 的关系?

// 创建 GLES 环境

int BgRender::CreateGlesEnv()

{

// EGL config attributes

const EGLint confAttr[] =

{

EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,

EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,//EGL_WINDOW_BIT EGL_PBUFFER_BIT we will create a pixelbuffer surface

EGL_RED_SIZE,   8,

EGL_GREEN_SIZE, 8,

EGL_BLUE_SIZE,  8,

EGL_ALPHA_SIZE, 8,// if you need the alpha channel

EGL_DEPTH_SIZE, 8,// if you need the depth buffer

EGL_STENCIL_SIZE,8,

EGL_NONE

};

// EGL context attributes

const EGLint ctxAttr[] = {

EGL_CONTEXT_CLIENT_VERSION, 2,

EGL_NONE

};

// surface attributes

// the surface size is set to the input frame size

const EGLint surfaceAttr[] = {

EGL_WIDTH, 1,

EGL_HEIGHT,1,

EGL_NONE

};

EGLint eglMajVers, eglMinVers;

EGLint numConfigs;

int resultCode = 0;

do

{

//1. 获取 EGLDisplay 对象,建立与本地窗口系统的连接

m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

if(m_eglDisplay == EGL_NO_DISPLAY)

{

//Unable to open connection to local windowing system

LOGCATE("BgRender::CreateGlesEnv Unable to open connection to local windowing system");

resultCode = -1;

break;

}

//2. 初始化 EGL 方法

if(!eglInitialize(m_eglDisplay, &eglMajVers, &eglMinVers))

{

// Unable to initialize EGL. Handle and recover

LOGCATE("BgRender::CreateGlesEnv Unable to initialize EGL");

resultCode = -1;

break;

}

LOGCATE("BgRender::CreateGlesEnv EGL init with version %d.%d", eglMajVers, eglMinVers);

//3. 获取 EGLConfig 对象,确定渲染表面的配置信息

if(!eglChooseConfig(m_eglDisplay, confAttr, &m_eglConf, 1, &numConfigs))

{

LOGCATE("BgRender::CreateGlesEnv some config is wrong");

resultCode = -1;

break;

}

//4. 创建渲染表面 EGLSurface, 使用 eglCreatePbufferSurface 创建屏幕外渲染区域

m_eglSurface = eglCreatePbufferSurface(m_eglDisplay, m_eglConf, surfaceAttr);

if(m_eglSurface == EGL_NO_SURFACE)

{

switch(eglGetError())

{

case EGL_BAD_ALLOC:

// Not enough resources available. Handle and recover

LOGCATE("BgRender::CreateGlesEnv Not enough resources available");

break;

case EGL_BAD_CONFIG:

// Verify that provided EGLConfig is valid

LOGCATE("BgRender::CreateGlesEnv provided EGLConfig is invalid");

break;

case EGL_BAD_PARAMETER:

// Verify that the EGL_WIDTH and EGL_HEIGHT are

// non-negative values

LOGCATE("BgRender::CreateGlesEnv provided EGL_WIDTH and EGL_HEIGHT is invalid");

break;

case EGL_BAD_MATCH:

// Check window and EGLConfig attributes to determine

// compatibility and pbuffer-texture parameters

LOGCATE("BgRender::CreateGlesEnv Check window and EGLConfig attributes");

break;

}

}

//5. 创建渲染上下文 EGLContext

m_eglCtx = eglCreateContext(m_eglDisplay, m_eglConf, EGL_NO_CONTEXT, ctxAttr);

if(m_eglCtx == EGL_NO_CONTEXT)

{

EGLint error = eglGetError();

if(error == EGL_BAD_CONFIG)

{

// Handle error and recover

LOGCATE("BgRender::CreateGlesEnv EGL_BAD_CONFIG");

resultCode = -1;

break;

}

}

//6. 绑定上下文

if(!eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglCtx))

{

LOGCATE("BgRender::CreateGlesEnv MakeCurrent failed");

resultCode = -1;

break;

}

LOGCATE("BgRender::CreateGlesEnv initialize success!");

}

while (false);

if (resultCode != 0)

{

LOGCATE("BgRender::CreateGlesEnv fail");

}

return resultCode;

}

//渲染

void BgRender::Draw()

{

LOGCATE("BgRender::Draw");

if (m_ProgramObj == GL_NONE) return;

glViewport(0, 0, m_RenderImage.width, m_RenderImage.height);

// Do FBO off screen rendering

glUseProgram(m_ProgramObj);

glBindFramebuffer(GL_FRAMEBUFFER, m_FboId);

glBindVertexArray(m_VaoIds[0]);

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, m_ImageTextureId);

glUniform1i(m_SamplerLoc, 0);

if (m_TexSizeLoc != GL_NONE) {

GLfloat size[2];

size[0] = m_RenderImage.width;

size[1] = m_RenderImage.height;

glUniform2fv(m_TexSizeLoc, 1, &size[0]);

}

//7. 渲染

GO_CHECK_GL_ERROR();

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);

GO_CHECK_GL_ERROR();

glBindVertexArray(GL_NONE);

glBindTexture(GL_TEXTURE_2D, GL_NONE);

//一旦解绑 FBO 后面就不能调用 readPixels

//glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE);

}

//释放 GLES 环境

void BgRender::DestroyGlesEnv()

{

//8. 释放 EGL 环境

if (m_eglDisplay != EGL_NO_DISPLAY) {

eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);

eglDestroyContext(m_eglDisplay, m_eglCtx);

eglDestroySurface(m_eglDisplay, m_eglSurface);

eglReleaseThread();

eglTerminate(m_eglDisplay);

}

m_eglDisplay = EGL_NO_DISPLAY;

m_eglSurface = EGL_NO_SURFACE;

m_eglCtx = EGL_NO_CONTEXT;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值