好比OpenGL会经常挂在drawcall上,然而很有可能是在前面的glBindTexture、glTexImage2D或glUniformMatrix等方法中出现了问题。 GL_STENCIL_BUFFER_BIT) iOS9系统图片花屏 iOS 9上使用CGContextDrawImage解码图片时会带上上一次解码的残影,即使是一个新的CGContext也会,需要在draw前clearRect glTexImage2D crash可能情况1 传入参数中宽高参数与pixels不对应,宽高大于pixels实际宽高时crash,小于时花屏 glTexImage2D crash可能情况2 之前调用glPixelStorei修改过 GL_UNPACK_ALIGNMENT参数,假如GL_UNPACK_ALIGNMENT大小与glTexImage2D中pixels参数的单位像素字节数不符就会crash,这是很明显的累积错误引发的crash
生成outputFramebuffer,初始化时要指定数据的格式GPUPixelFormat,其核心方法是- (void)uploadBytes:(GLubyte *)bytesToUpload,通过glTexImage2D self.outputTextureOptions onlyTexture:YES]; glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]); glTexImage2D renderInContext显示内容,核心方法是- (void)updateWithTimestamp:(CMTime)frameTime 将显示的内容绘制到CoreGraphics上下文,获取图像数据后通过glTexImage2D texture]); // no need to use self.outputTextureOptions here, we always need these texture options glTexImage2D 产生纹理的具体代码 if ([GPUImageContext supportsFastTextureUpload] && captureAsYUV) { // 这里产生YUV纹理 } 否则还是调用glTexImage2D
= 2 * 2) = 6个面的颜色数据; 注:图片类型的数据要自己写转换方法,生成像素数据;当然也可以使用 GLKit 提供的 TextureLoder 类来加载图片像素数据; (3)【核心】glTexImage2D 得到纹理像素的方法,就是加载纹理像素到 GPU 的方法: glTexImage2D void glTexImage2D (GLenum target, GLint level, GLint internalformat 像素模式下的使用: if (texMode == GL_TEXTURE_2D) { glTexImage2D(texMode, 0, GL_RGB, 2, 2, GL_FALSE, GL_RGB , GL_FLOAT, tex2DPixelDatas); } else { // glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X , 0, GL_RGB, 2, 2, GL_FALSE, GL_RGB, GL_FLOAT, texCubemapPixelDatas[0]); // glTexImage2D
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_TextureIds[0]); glTexImage2D glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_TextureIds[0]); glTexImage2D glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_TextureIds[1]); glTexImage2D glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_TextureIds[0]); glTexImage2D glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_TextureIds[1]); glTexImage2D
Target 标签有 2 个:GL_PIXEL_UNPACK_BUFFER 和 GL_PIXEL_PACK_BUFFER ,其中将 PBO 绑定为 GL_PIXEL_UNPACK_BUFFER 时,glTexImage2D 不使用 PBO 加载纹理 上图从文件中加载纹理,图像数据首先被加载到 CPU 内存中,然后通过 glTexImage2D 函数将图像数据从 CPU 内存复制到 OpenGL 纹理对象中 (GPU 内存) 所以,绑定 PBO 后,执行 glTexImage2D (将图像数据从 PBO 传输到纹理对象) 操作,CPU 无需等待,可以立即返回。
GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0); //将纹理数据设置为单精度浮点数 glTexImage2D GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, nWidth, nHeight,0, GL_RGBA, GL_FLOAT, NULL); //将数据传至输入纹理缓存 //glTexImage2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 57 58 //将数据传至输入纹理缓存 59 glTexImage2D tex); 69 70 system("pause"); 71 72 return 0; 73 } 数据类型要设置为unsigned_byte,将数据送至纹理缓存要用这个函数glTexImage2D
我们在渲染图像到屏幕的时候,需要用到glTexImage2D()函数指定二维纹理图像,这个函数各个参数的含义如下: target:指定目标纹理,这个值必须是GL_TEXTURE_2D level:执行细节级别 //y平面 glActiveTexture(GL_TEXTURE0) glBindTexture(GL_TEXTURE_2D,textures[0]) glTexImage2D //u平面 glActiveTexture(GL_TEXTURE1) glBindTexture(GL_TEXTURE_2D,textures[1]) glTexImage2D //v平面 glActiveTexture(GL_TEXTURE2) glBindTexture(GL_TEXTURE_2D,textures[2]) glTexImage2D //y平面 glActiveTexture(GL_TEXTURE0) glBindTexture(GL_TEXTURE_2D,textures[0]) glTexImage2D
GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D false; } glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_YTextureId); glTexImage2D m_RenderFrame.ppPlane[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_UTextureId); glTexImage2D
//upload Y plane data glBindTexture(GL_TEXTURE_2D, m_yTextureId); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE glBindTexture(GL_TEXTURE_2D, GL_NONE); //update UV plane data glBindTexture(GL_TEXTURE_2D, m_uvTextureId); glTexImage2D == GL_NONE) return; //upload Y plane data glBindTexture(GL_TEXTURE_2D, m_yTextureId); glTexImage2D GL_TEXTURE_2D, GL_NONE); //update UV plane data glBindTexture(GL_TEXTURE_2D, m_uvTextureId); glTexImage2D
得到了所有像素数据之后,实际最终还是调用了 OpenGL 的 glTexImage2D 来实现纹理上传。 看到上面那两个 API 基本就稳了,再配合 stb_image 介绍过的方法,stbi_load_from_memory 从内存中加载图片的像素数据,最后就是 glTexImage2D 方法实现纹理上传
Target 标签有 2 个:GL_PIXEL_UNPACK_BUFFER 和 GL_PIXEL_PACK_BUFFER ,其中将 PBO 绑定为 GL_PIXEL_UNPACK_BUFFER 时,glTexImage2D 不使用 PBO 加载纹理 上图从文件中加载纹理,图像数据首先被加载到 CPU 内存中,然后通过 glTexImage2D 函数将图像数据从 CPU 内存复制到 OpenGL 纹理对象中 (GPU 内存) 所以,绑定 PBO 后,执行 glTexImage2D (将图像数据从 PBO 传输到纹理对象) 操作,CPU 无需等待,可以立即返回。
//upload Y plane data glBindTexture(GL_TEXTURE_2D, m_yTextureId); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE glBindTexture(GL_TEXTURE_2D, GL_NONE); //update UV plane data glBindTexture(GL_TEXTURE_2D, m_uvTextureId); glTexImage2D == GL_NONE) return; //upload Y plane data glBindTexture(GL_TEXTURE_2D, m_yTextureId); glTexImage2D GL_TEXTURE_2D, GL_NONE); //update UV plane data glBindTexture(GL_TEXTURE_2D, m_uvTextureId); glTexImage2D
OpenGL的glDrawPixels()函数也能实现图像显示,但是现在高版本的OpenGL都采用glTexImage2D()贴纹理的方式了,也不用考虑图像大小是否是2的N次方,或者4字节对齐的问题。 //放大纹理过滤方式 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //缩小纹理过滤方式 glTexImage2D
然后我直接贴给他们一段在 OpenGL 环境下验证过的上传 16bit 图像数据的代码 glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, width, height, 0 = vec4(vec3(val / 65535.0), 1.0); } 加载数据到纹理: glBindTexture(GL_TEXTURE_2D, m_uTextureId); glTexImage2D
textureID; glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); 立方体贴图包含6个纹理,所以需要调用glTexImage2D textures_faces.size(); i++) { data = stbi_load(textures_faces[i].c_str(), &width, &height, &nrChannels, 0); glTexImage2D stbi_load(faces[i].c_str(), &width, &height, &nrChannels, 0); if (data) { glTexImage2D nrComponents == 4) format = GL_RGBA; glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D stbi_load(faces[i].c_str(), &width, &height, &nrChannels, 0); if (data) { glTexImage2D
glBindTexture(GL_TEXTURE_2D, textureY); glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeY); glTexImage2D glBindTexture(GL_TEXTURE_2D, textureU); glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeU); glTexImage2D glBindTexture(GL_TEXTURE_2D, textureV); glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeV); glTexImage2D
baidu/Downloads/container.jpg", &width, &height, &nrChannels, 0); if (data) { glTexImage2D data = stbi_load("awesomeface.png", &width, &height, &nrChannels, 0); if (data) { glTexImage2D
GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D
glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); 由于立方图包含 6 个纹理,每个面对应一个纹理,需要调用glTexImage2D GL_TEXTURE_CUBE_MAP, m_TextureId); for (int i = 0; i < sizeof(m_pSkyBoxRenderImg) / sizeof(NativeImage); ++i) { glTexImage2D
GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //加载 RGBA 格式的图像数据 glTexImage2D RGBA image data glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_TextureId); glTexImage2D