使用大小渲染UIImage>;1024,在iPhone上使用OpenGL ES 2.0
我正在iPhone 4(1936X2592)上拍摄一张全分辨率的UIImage使用大小渲染UIImage>;1024,在iPhone上使用OpenGL ES 2.0,iphone,ios,opengl-es,uiimage,rendering,Iphone,Ios,Opengl Es,Uiimage,Rendering,我正在iPhone 4(1936X2592)上拍摄一张全分辨率的UIImage 然后我将它缩放到一个1936x1936大小的正方形 现在我需要将这个图像加载到纹理中,让OpenGL使用一些GLSL进行渲染 问题是OpenGL只支持2种纹理大小,最多支持1024种 那么我该如何解决这个问题呢 多谢各位 编辑:我的问题无关紧要,我的目标是3GS及以上,它支持2048x2048图像大小。 我的问题是另一个问题:既然iPhone4只有960x640的屏幕,为什么不把屏幕缩小到1024x1024?这样你就
然后我将它缩放到一个1936x1936大小的正方形 现在我需要将这个图像加载到纹理中,让OpenGL使用一些GLSL进行渲染 问题是OpenGL只支持2种纹理大小,最多支持1024种 那么我该如何解决这个问题呢 多谢各位 编辑:我的问题无关紧要,我的目标是3GS及以上,它支持2048x2048图像大小。
我的问题是另一个问题:既然iPhone4只有960x640的屏幕,为什么不把屏幕缩小到1024x1024?这样你就不会不必要地浪费内存 否则,将其拆分为4个纹理 编辑:当你再画4张时,你实际上不必破坏原始图像 至于将一个图像分割成4个独立的UIImage,这相当容易。要将左上方的1024x1024渲染为UIImage,可以执行以下操作
subImageArea = CGRectMake( 0, 0, 1024, 1024 );
CGImage* pCGSubImage = CGImageCreateWithImageInRect( [pUILargeImage CGImage], subImageArea );
UIImage* pUISubImage = [UIImage initWithCGImage: pCGSubImage];
既然iPhone4的屏幕只有960x640,为什么不把它缩小到1024x1024呢?这样你就不会不必要地浪费内存 否则,将其拆分为4个纹理 编辑:当你再画4张时,你实际上不必破坏原始图像 至于将一个图像分割成4个独立的UIImage,这相当容易。要将左上方的1024x1024渲染为UIImage,可以执行以下操作
subImageArea = CGRectMake( 0, 0, 1024, 1024 );
CGImage* pCGSubImage = CGImageCreateWithImageInRect( [pUILargeImage CGImage], subImageArea );
UIImage* pUISubImage = [UIImage initWithCGImage: pCGSubImage];
从3GS开始,OpenGL最多支持2048x2048的纹理。4S和iPad2支持4096x4096 但是,如果情况并非如此,那么您的选项将围绕着将像素打包在一起并进行有损压缩,或者使用多个纹理,这两种纹理都可以在GLSL中或通过几何体进行修复(代价高昂) 最明显的选择是作为四个分片上传。每个方向上的输出大小为1936,允许上载具有一些重叠的纹理,这样即使使用线性纹理过滤,也应该能够获得无缝连接。假设只需水平拆分,可以确保一个纹理的底部两行与另一个纹理的顶部两行相同,并将几何体连接放在这两行之间
其他选项不仅不那么明显,而且也不那么有用。就有损压缩而言,您可以将纹理从RGB转换到YUV空间,在表示每个RGBA样本的32位中,存储四个5位Y样本、一个6位U样本和一个6位V样本。然后在着色器中解包并重新组合。但是,您的视觉质量会降低,性能也会大大降低。从3GS开始,OpenGL支持高达2048x2048的纹理。4S和iPad2支持4096x4096 但是,如果情况并非如此,那么您的选项将围绕着将像素打包在一起并进行有损压缩,或者使用多个纹理,这两种纹理都可以在GLSL中或通过几何体进行修复(代价高昂) 最明显的选择是作为四个分片上传。每个方向上的输出大小为1936,允许上载具有一些重叠的纹理,这样即使使用线性纹理过滤,也应该能够获得无缝连接。假设只需水平拆分,可以确保一个纹理的底部两行与另一个纹理的顶部两行相同,并将几何体连接放在这两行之间
其他选项不仅不那么明显,而且也不那么有用。就有损压缩而言,您可以将纹理从RGB转换到YUV空间,在表示每个RGBA样本的32位中,存储四个5位Y样本、一个6位U样本和一个6位V样本。然后在着色器中解包并重新组合。但是,您的视觉质量会降低,性能也会大大降低。根据我在前面的答案中所读到的内容,您可以使用2048x2048的纹理大小 我在截图时遇到了类似的问题,屏幕大小为960x640->1024x1024纹理大小,我只是这样做:
void *buffer = malloc( x * y * 4 );
glReadPixels(0,0,x,y,GL_RGBA,GL_UNSIGNED_BYTE,buffer);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &screenShotTexture);
glBindTexture(GL_TEXTURE_2D, screenShotTexture);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
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_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
free(buffer);
当然我要确定x和y是POT。
我还必须摆弄纹理贴图,如下所示:
static const float screenTexCoordsR[] = {
0.0, 0.0,
0.0, 0.9375,
0.625, 0.0,
0.625, 0.9375
};
你的答案不会太浪费,而不是0.9375和0.625,你会得到0.9453或其他东西。根据我在你之前的答案中读到的,你可以接受2048x2048的纹理大小 我在截图时遇到了类似的问题,屏幕大小为960x640->1024x1024纹理大小,我只是这样做:
void *buffer = malloc( x * y * 4 );
glReadPixels(0,0,x,y,GL_RGBA,GL_UNSIGNED_BYTE,buffer);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &screenShotTexture);
glBindTexture(GL_TEXTURE_2D, screenShotTexture);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
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_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
free(buffer);
当然我要确定x和y是POT。
我还必须摆弄纹理贴图,如下所示:
static const float screenTexCoordsR[] = {
0.0, 0.0,
0.0, 0.9375,
0.625, 0.0,
0.625, 0.9375
};
你的图像不会太浪费,而不是0.9375和0.625,你会得到0.9453或其他什么。我希望完整分辨率的渲染图像保存在iPhone的相机卷中。你能详细说明一下如何将UIImage分割成多个纹理吗?我希望完整分辨率的渲染图像能保存在iPhone的相机卷中。你能详细介绍一下如何将UIImage分割成多个纹理吗?我的应用程序支持3GS及以上,所以它解决了这个问题,但OpenGL只支持2个纹理的功能,而1936不支持。那么我该怎么做呢?您能将其填充到2048吗(或者,使用带有空数据指针的
glTexImage2D
创建2048x2048纹理,然后使用实际数据创建glTexSubImage2D
,以便GL为您完成工作)然后适当地提供纹理坐标以仅使用1936像素的纹理?我的应用程序支持3GS及以上,所以它解决了这个问题,但OpenGL只支持2个纹理的能力,而1936不支持。那么我该怎么做呢?您能将其填充到2048吗(或者,使用带有空数据指针的glTexImage2D
创建2048x2048纹理,然后使用实际数据创建glTexSubImage2D
,以便GL为您完成工作)然后适当地提供纹理坐标,仅使用1936像素的纹理?我不明白在你将任何东西放入缓冲区之前,你是如何将fbo像素读入缓冲区的。在我的情况下,我直接用glReadPixels读取,但你可能需要从uiimage数据中复制到它。我不明白你是如何将fbo像素读入其中的