Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用大小渲染UIImage>;1024,在iPhone上使用OpenGL ES 2.0_Iphone_Ios_Opengl Es_Uiimage_Rendering - Fatal编程技术网

使用大小渲染UIImage>;1024,在iPhone上使用OpenGL ES 2.0

使用大小渲染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?这样你就

我正在iPhone 4(1936X2592)上拍摄一张全分辨率的UIImage
然后我将它缩放到一个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像素读入其中的