OpenGL常用函数笔记
2018-05-02 本文已影响45人
whlpkk
glTexImage2D
void glTexImage2D (
GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels
);
为当前绑定的纹理对象开辟内存并填充pixels数据到相应内存,生成纹理图像
-
target
参数指定了纹理目标。设置为GL_TEXTURE_2D意味着会生成与当前绑定的纹理对象在同一个目标上的纹理(任何绑定到GL_TEXTURE_1D和GL_TEXTURE_3D的纹理不会受到影响)。 -
level
参数为纹理指定多级渐远纹理的级别,如果你希望单独手动设置每个多级渐远纹理的级别的话。这里我们填0,也就是基本级别。 -
internalformat
参数告诉OpenGL我们希望把纹理储存为何种格式。我们的图像只有RGB值,因此我们也把纹理储存为RGB值。 -
width
height
参数设置最终的纹理的宽度和高度。我们之前加载图像的时候储存了它们,所以我们使用对应的变量。 -
border
参数应该总是被设为0(历史遗留的问题)。 -
format
type
参数定义了源图的格式和数据类型。我们使用RGB值加载这个图像,并把它们储存为char(byte)
数组,我们将会传入对应值。 -
pixels
参数是真正的图像数据。
glFramebufferTexture2D
void glFramebufferTexture2D (
GLenum target,
GLenum attachment,
GLenum textarget,
GLuint texture,
GLint level
);
把纹理附件绑定到帧缓冲
-
target
:帧缓冲的目标GL_FRAMEBUFFER
GL_READ_FRAMEBUFFER
GL_DRAW_FRAMEBUFFER
-
attachment
:我们想要附加的附件类型。颜色、深度、模板GL_COLOR_ATTACHMENT0
GL_DEPTH_ATTACHMENT
GL_STENCIL_ATTACHMENT
-
textarget
:你希望附加的纹理类型GL_TEXTURE_2D
-
texture
:要附加的纹理本身 -
level
:多级渐远纹理的级别。我们将它保留为0。
eg: 颜色附件
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
//对于这个纹理,我们仅仅分配了内存而没有填充它。填充这个纹理将会在我们渲染到帧缓冲之后来进行
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//把纹理附件绑定到帧缓冲
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
深度模板附件
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texture, 0);
CVOpenGLESTextureCacheCreateTextureFromImage
CVOpenGLESTextureCacheCreateTextureFromImage(
CFAllocatorRef _Nullable allocator,
CVOpenGLESTextureCacheRef _Nonnull textureCache,
CVImageBufferRef _Nonnull sourceImage,
CFDictionaryRef _Nullable textureAttributes,
GLenum target,
GLint internalFormat,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
size_t planeIndex,
CVOpenGLESTextureRef _Nullable * _Nonnull textureOut
);
根据图片生成纹理对象
- 参数
allocator
kCFAllocatorDefault,默认分配内存 - 参数
textureCache
纹理缓存 - 参数
sourceImage
图片 - 参数
textureAttributes
NULL - 参数
target
, GL_TEXTURE_2D(创建2维纹理对象) - 参数
internalFormat
GL_LUMINANCE,亮度格式 - 参数
width
图片宽 - 参数
height
图片高 - 参数
format
GL_LUMINANCE 亮度格式 - 参数
type
图片类型 GL_UNSIGNED_BYTE - 参数
planeIndex
0,平面角标,表示第0个平面,比如YUV数据,Y是第0个平面,UV是第一个平面 - 参数
textureOut
输出的纹理对象
eg:
#pragma mark - 7、创建纹理对象,渲染采集图片到屏幕
- (void)setupTexture:(CMSampleBufferRef)sampleBuffer
{
// 获取图片信息
CVImageBufferRef imageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer);
// 获取图片宽度
GLsizei bufferWidth = (GLsizei)CVPixelBufferGetWidth(imageBufferRef);
_bufferWidth = bufferWidth;
GLsizei bufferHeight = (GLsizei)CVPixelBufferGetHeight(imageBufferRef);
_bufferHeight = bufferHeight;
// 创建亮度纹理
// 激活纹理单元0, 不激活,创建纹理会失败
glActiveTexture(GL_TEXTURE0);
// 创建纹理对象
CVReturn err;
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _textureCacheRef, imageBufferRef, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &_luminanceTextureRef);
if (err) {
NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
}
// 获取纹理对象id
_luminanceTexture = CVOpenGLESTextureGetName(_luminanceTextureRef);
// 绑定纹理
glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), _luminanceTexture);
//CVOpenGLESTextureGetTarget(renderTexture)获取纹理绑定的target,在这里是GL_TEXTURE_2D,所以下面写也可以
//glBindTexture(GL_TEXTURE_2D, _luminanceTexture);
// 设置纹理滤波
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// 激活单元1
glActiveTexture(GL_TEXTURE1);
// 创建色度纹理
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _textureCacheRef, imageBufferRef, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth / 2, bufferHeight / 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &_chrominanceTextureRef);
if (err) {
NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
}
// 获取纹理对象
_chrominanceTexture = CVOpenGLESTextureGetName(_chrominanceTextureRef);
// 绑定纹理
glBindTexture(GL_TEXTURE_2D, _chrominanceTexture);
// 设置纹理滤波
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}