GL_LUMINANCE
时间: 2023-07-14 18:09:40 浏览: 67
GL_LUMINANCE 是 OpenGL 中的一个常量,用于指定纹理的内部格式或颜色分量的格式。
在纹理中,使用 GL_LUMINANCE 内部格式时,每个纹素只包含亮度信息(灰度值),没有色彩信息。这可以用来创建灰度图像或在一些特定的图像处理算法中使用。
对于颜色分量的格式,GL_LUMINANCE 表示使用单个亮度通道来表示颜色信息。这可以用于一个只需要亮度信息的场景,例如黑白摄像头图像。
需要注意的是,GL_LUMINANCE 在 OpenGL ES 3.0 版本之后已被废弃,并且在较新的 OpenGL 版本中也不再推荐使用。取而代之的是 GL_RED 或 GL_R,它们提供了更灵活和通用的颜色分量表示方式。
总结来说,GL_LUMINANCE 是用于指定纹理内部格式或颜色分量格式的一个常量,表示只包含亮度信息或使用单个亮度通道表示颜色信息。
相关问题
opengles yuv420 单纹理
在使用OpenGL ES渲染YUV420格式视频时,可以使用单个纹理来处理。下面是一些步骤:
1. 创建一个纹理对象:
```
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
```
2. 设置纹理参数:
```
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
```
3. 绑定YUV数据到纹理:
```
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
```
4. 将YUV数据分别绑定到纹理的不同通道:
```
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, y_data);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width/2, height/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, u_data);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width/2, height/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, v_data);
```
5. 使用着色器将纹理渲染到屏幕上:
```
glUseProgram(program);
glUniform1i(glGetUniformLocation(program, "y_texture"), 0);
glUniform1i(glGetUniformLocation(program, "u_texture"), 1);
glUniform1i(glGetUniformLocation(program, "v_texture"), 2);
// 绘制图形
```
这样就可以使用单个纹理来处理YUV420格式视频了。
opengl es 中MediaCodec通过C++将YUV格式编码成MP4视频代码例子
以下是一个简单的例子,展示了如何使用OpenGL ES和MediaCodec将YUV格式编码成MP4视频。在此之前,需要确保您已经了解了OpenGL ES和MediaCodec的基本使用方法。
首先,需要创建OpenGL ES环境,并将YUV数据绘制到纹理上。以下是示例代码:
```c++
// 创建OpenGL ES环境
EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
EGLint major, minor;
eglInitialize(eglDisplay, &major, &minor);
EGLint configAttribs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_DEPTH_SIZE, 0,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE
};
EGLint numConfigs;
EGLConfig eglConfig;
eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &numConfigs);
EGLint pbufferAttribs[] = {
EGL_WIDTH, width,
EGL_HEIGHT, height,
EGL_NONE,
};
EGLSurface eglSurface = eglCreatePbufferSurface(eglDisplay, eglConfig, pbufferAttribs);
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
// 创建OpenGL ES纹理
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 绘制YUV数据到纹理上
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, YUVData);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, width / 2, height / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, YUVData + width * height);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, width / 2, height / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, YUVData + width * height * 5 / 4);
```
然后,需要创建MediaCodec编码器,并将OpenGL ES纹理作为输入数据。以下是示例代码:
```c++
// 创建MediaCodec编码器
AMediaFormat* format = AMediaFormat_new();
AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, "video/avc");
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_WIDTH, width);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_HEIGHT, height);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_BIT_RATE, bitRate);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_FRAME_RATE, frameRate);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_COLOR_FORMAT, OMX_COLOR_FormatYUV420SemiPlanar);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_I_FRAME_INTERVAL, iFrameInterval);
AMediaCodec* codec = AMediaCodec_createEncoderByType("video/avc");
AMediaCodec_configure(codec, format, NULL, NULL, AMEDIACODEC_CONFIGURE_FLAG_ENCODE);
AMediaCodec_start(codec);
// 将OpenGL ES纹理作为输入数据
AMediaCodecBufferInfo bufferInfo;
memset(&bufferInfo, 0, sizeof(bufferInfo));
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
for (int i = 0; i < frameCount; i++) {
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
// 绘制YUV数据到纹理上
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, YUVData);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, width / 2, height / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, YUVData + width * height);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, width / 2, height / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, YUVData + width * height * 5 / 4);
// 将纹理作为输入数据
glUseProgram(program);
glUniform1i(texSamplerHandle, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// 从MediaCodec编码器获取输出数据
int outputBufferIndex = AMediaCodec_dequeueOutputBuffer(codec, &bufferInfo, 0);
if (outputBufferIndex >= 0) {
AMediaCodecBufferInfo* outputBufferInfo = AMediaCodec_getOutputBufferInfo(codec, outputBufferIndex);
uint8_t* outputBuffer = AMediaCodec_getOutputBuffer(codec, outputBufferIndex);
// 将输出数据写入MP4文件
fwrite(outputBuffer, 1, outputBufferInfo->size, outputFile);
AMediaCodec_releaseOutputBuffer(codec, outputBufferIndex, false);
}
}
```
最后,需要释放资源并停止编码器。以下是示例代码:
```c++
// 释放资源
AMediaCodec_stop(codec);
AMediaCodec_delete(codec);
AMediaFormat_delete(format);
glDeleteTextures(1, &textureID);
eglDestroySurface(eglDisplay, eglSurface);
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(eglDisplay, eglContext);
eglTerminate(eglDisplay);
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)