2020-09-07

2020-10-26  本文已影响0人  adaodao3056

GLSL实现渲染图片 纹理需要翻转的原因:手机的(0,0)点在左上角,纹理的(0,0)点在左下角,导致渲染出来的图片是倒置的。

方法1:改变纹素获取坐标

片元着色器中,纹素获取后 改为的1.0 - y

/*varying lowp vec2 varyTextCoord;uniform sampler2D colorMap;voidmain(){//gl_FragColor = texture2D(colorMap, varyTextCoord);gl_FragColor=texture2D(colorMap,vec2(varyTextCoord.x,1.0-varyTextCoord.y));}

方法2:顶点着色器 纹理坐标

顶点着色器,纹理坐标 改为的1.0 - y

attribute vec4 position;attribute vec2 textCoordinate;varying lowp vec2 varyTextCoord;voidmain(){//varyTextCoord = textCoordinate;varyTextCoord=vec2(textCoordinate.x,1.0-textCoordinate.y);gl_Position=position;}

方法3:获取纹理 ,图片解压是,对图片进行 平移,缩放操作

//1、将 UIImage 转换为 CGImageRefCGImageRef spriteImage=[UIImage imageNamed:fileName].CGImage;//判断图片是否获取成功if(!spriteImage){NSLog(@"Failed to load image %@",fileName);exit(1);}//2、读取图片的大小,宽和高size_t width=CGImageGetWidth(spriteImage);size_t height=CGImageGetHeight(spriteImage);//3.获取图片字节数 宽4(RGBA)GLubytespriteData=(GLubyte)calloc(widthheight4,sizeof(GLubyte));//4.创建上下文/*

参数1:data,指向要渲染的绘制图像的内存地址

参数2:width,bitmap的宽度,单位为像素

参数3:height,bitmap的高度,单位为像素

参数4:bitPerComponent,内存中像素的每个组件的位数,比如32位RGBA,就设置为8

参数5:bytesPerRow,bitmap的没一行的内存所占的比特数

参数6:colorSpace,bitmap上使用的颜色空间  kCGImageAlphaPremultipliedLast:RGBA

*/CGContextRef spriteContext=CGBitmapContextCreate(spriteData,width,height,8,width*4,CGImageGetColorSpace(spriteImage),kCGImageAlphaPremultipliedLast);//5、在CGContextRef上--> 将图片绘制出来

*/
CGContextDrawImage 使用的是Core Graphics框架,坐标系与UIKit 不一样。UIKit框架的原点在屏幕的左上角,Core Graphics框架的原点在屏幕的左下角。

CGContextDrawImage

参数1:绘图上下文

参数2:rect坐标

参数3:绘制的图片

*/CGRect rect=CGRectMake(0,0,width,height);//6.使用默认方式绘制CGContextDrawImage(spriteContext,rect,spriteImage);

CGContextTranslateCTM(spriteContext,0,rect.size.height);//平移CGContextScaleCTM(spriteContext,1.0,-1.0);//缩放

CGContextDrawImage(spriteContext,rect,spriteImage);//7、画图完毕就释放上下文CGContextRelease(spriteContext);

方法4:直接改变顶点纹理数组中 纹理坐标

//前3个是顶点坐标,后2个是纹理坐标// GLfloat attrArr[] =// {// 0.5f, -0.5f, -1.0f, 1.0f, 0.0f,// -0.5f, 0.5f, -1.0f, 0.0f, 1.0f,// -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,//// 0.5f, 0.5f, -1.0f, 1.0f, 1.0f,// -0.5f, 0.5f, -1.0f, 0.0f, 1.0f,// 0.5f, -0.5f, -1.0f, 1.0f, 0.0f,// };GLfloat attrArr[]={0.5f,-0.5f,-1.0f,1.0f,1.0f,-0.5f,0.5f,-1.0f,0.0f,0.0f,-0.5f,-0.5f,-1.0f,0.0f,1.0f,0.5f,0.5f,-1.0f,1.0f,0.0f,-0.5f,0.5f,-1.0f,0.0f,0.0f,0.5f,-0.5f,-1.0f,1.0f,1.0f,};

上一篇下一篇

猜你喜欢

热点阅读