创建AHardwareBuffer并填充颜色
AHardwareBuffer_Desc desc = {
static_cast<uint32_t>(screenW),
static_cast<uint32_t>(screenH),
1,
AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
AHARDWAREBUFFER_USAGE_CPU_READ_NEVER | AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER |
AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT,
0,
0,
0};
int errCode = AHardwareBuffer_allocate(&desc, &mAHardwareBuffer);
//
unsigned char *ptrReader = nullptr;
AHardwareBuffer_lock(mAHardwareBuffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr,
(void **) &ptrReader);
// memset(ptrReader, 123456 ,screenW*screenH * sizeof(uint32_t));
unsigned int* mysurface=(unsigned int*)ptrReader;
for(int i=0;i<screenH;i++)
for(int j=0;j<screenW;j++){
unsigned int color=(16<<(i%255))|(8<<(j%255))|((j*i)%255)|0xff000000;
mysurface[i*screenW+j]=color;
}
int32_t fence = -1;
AHardwareBuffer_unlock(mAHardwareBuffer, &fence);
从AHardwareBuffer创建EGLImageKHR并填充到纹理
bool EGLImageTest::bindEGLImage(GLenum type,GLuint texId) {
if (!mAHardwareBuffer || texId == 0) {
LOGE("bindTexture failed: buffer_ or texId null");
return false;
}
EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(mAHardwareBuffer);
if (!clientBuffer) {
LOGE("bindTexture failed: clientBuffer null");
return false;
}
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (image_ != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(display, image_);
}
EGLint eglImageAttributes[] = { EGL_IMAGE_PRESERVED, EGL_TRUE, EGL_NONE};
image_ = eglCreateImageKHR(mEglCore->getEGLDisplay(), mEglCore->getEGLContext(), EGL_NATIVE_BUFFER_ANDROID,
clientBuffer, eglImageAttributes);
if (image_ == EGL_NO_IMAGE_KHR) {
LOGE("bindTexture failed: eglCreateImageKHR null");
GLUtils::CheckGLError("bindTexture failed: eglCreateImageKHR null");
return false;
}
glBindTexture(type, texId);
glEGLImageTargetTexture2DOES(type, (GLeglImageOES) image_);
return true;
}
演示使用GL_TEXTURE_EXTERNAL_OES纹理渲染
readTextureOES = GLUtils::createTextureOES(screenW,screenH);
bindEGLImage(GL_TEXTURE_EXTERNAL_OES,readTextureOES);
///
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_EXTERNAL_OES,readTextureOES);
glUniform1i(glGetUniformLocation(m_ProgramObj,"mainTexture"), 0);
片段着色器
#version 320 es
#ifdef GL_OES_EGL_image_external
#extension GL_OES_EGL_image_external : require
#else
#extension GL_OES_EGL_image_external_essl3 : require
#endif
precision highp float;
layout(std140, column_major) uniform;
uniform samplerExternalOES mainTexture;
uniform sampler2D srcTexture;
in vec2 aOutTexCoord;
out vec4 FragColor;
void main()
{
vec4 color = texture(mainTexture,aOutTexCoord).rgba;
FragColor = vec4(color.rgb,0.5);
// FragColor = vec4(aOutTexCoord,0.0,0.5);
}
如果使用GL_TEXTURE_EXTERNAL_OES纹理,在片段着色器中要用这句声明:
#extension GL_OES_EGL_image_external : require