OpenGL ES 知识点-纹理

纹理

纹理是用来保存图像颜色元素之的OpenGL ES 缓存.当用一个图像初始化一个纹理缓存之后,在这个图像的中的每个像素变成纹理中的一个纹素(texel).

纹理坐标系中---命名为S 和 T的2D坐标.S的坐标范围0.0到1.0,T坐标是0.0到1.0.远点坐标在左下角.

纹理坐标系

帧缓存是按像素来匹配屏幕尺寸的.在渲染时,GPU会转换纯数字OpenGL ES 坐标系中的每个顶点的X,Y,Z坐标为帧缓存中所对应的真实像素位置.帧缓存对应的像素位置叫做视口(viewport)坐标.
在每个顶点被转化成视口坐标后,GPU会设置转换生成的三角形内的每个像素的颜色.转换几何形状数据为帧缓存中的颜色像素的渲染步骤叫做点阵化(rasterizing),每个颜色的像素叫做片元(fragment).
对其方式: 每个顶点还给出了U 和 V坐标值.每个U坐标会映射到顶点的视口中的最终位置到纹理中的沿着S轴的一个位置,V坐标映射到T轴.
取样模式GPU会根据计算出的每个片元的U,V位置从绑定的纹理中选择纹素.这个过程叫做取样.

  • 减小过滤选项
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MIN_FILTER,GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MIN_FILTER,GL_LINEAR)
    来配置每个绑定的纹理.
    GL_LINEAR 来指定参数,GL_TEXTURE_MIN_FILTER :多个纹素对应一个片元,从相匹配的多个纹素中取样颜色,然后用线性内插法混合这些颜色得到片元颜色.

GL_NEAREST 来指定参数,GL_TEXTURE_MIN_FILTER :与片元的U,V坐标最接近的纹素颜色会被取样.

  • 放大过滤选项
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MAG_FILTER,GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MAG_FILTER,GL_LINEAR)

GL_LINEAR 指定参数:GL_TEXTURE_MAG_FILTER : 一个纹素对应多个片元,会有一个放大纹理的效果,并让它模糊的出现在渲染的三角形上.
GL_NEAREST :取最临近纹素,并放大纹理.

  • 超出纹理选项
    当U,V坐标的值小于0或者大于1时,设置纹理的循环模式,分别设置 S 和 T 轴
    S 轴
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_S,GL_GLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_S,GL_REPEAT)
    T 轴
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_T,GL_GLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_T, GL_REPEAT)

透明度,混合和多重纹理

   当纹理计算出来一个完全不透明的最终片元颜色时,这个片元的颜色会简单替换任何帧缓存的像素颜色渲染缓存内现存的对应的像素颜色.
   如果部分透明或者全透明.OpenGL ES 会使用一个混合函数来混合片元颜色和像素颜色渲染缓存对应的像素.
  • 通过glEnalbe(GL_BLEND)开启混合
  • 通过glBlendFunc(sourceFactor,destinationFactor)设置混合函数.
    sourceFactor:用于指定每个片元的最终颜色元素怎么影响混合,常用值GL_SRC_ALPHA,让源片元的透明度元素依次与其他片元颜色元素相乘;
    destinationFactor:用于指定目标帧缓存中已经存在的颜色元素怎么影响混合,常用值:GL_ONE_MINUS_SRC_ALPHA,让源片元的透明度元素(1.0)与在帧缓存内的正在被更新的像素的颜色元素相乘.
混合模式的计算方式

所以app开发中将,视图设置为不透明,可以有效的提高图片的渲染性能

  • 配置参数
- (void)viewDidLoad {
    [super viewDidLoad];
   
    
    GLKView *glkView = (GLKView *)self.view;
    
    glkView.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    
    [EAGLContext setCurrentContext:glkView.context];
    
    
    self.buffer = [[AGLKVertexAttribArrayBuffer alloc] initWithAtrribStride:sizeof(ScenceVertex) numberOfVertices:sizeof(vertices)/sizeof(ScenceVertex) data:vertices usage:GL_STATIC_DRAW];
    
    self.baseEffect = [[GLKBaseEffect alloc] init];
    self.baseEffect.useConstantColor = GL_TRUE;
    self.baseEffect.constantColor = GLKVector4Make(
                                                   1,
                                                   1,
                                                   1,
                                                   1);
    
    self.info1 = [self loadTextureInfoWith:@"chi.jpg"];
    self.info2 = [self loadTextureInfoWith:@"vs_star_center.png"];
    
    //开启图片混合
    glEnable(GL_BLEND);
    
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
}

-(GLKTextureInfo *)loadTextureInfoWith:(NSString *)cgImageName
{

    CGImageRef imageRef = [UIImage imageNamed:cgImageName].CGImage;
    
    return [GLKTextureLoader textureWithCGImage:imageRef options:@{GLKTextureLoaderOriginBottomLeft:@YES} error:NULL];
    

}
  • 开始渲染

//重绘
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    [self.baseEffect prepareToDraw];
    //glClear 函数来设置当前绑定的帧缓存的像素颜色渲染缓存中的每一个像素的颜色为前面使用的glClearColor()函数设定的值.可以有效的设置帧缓存中的每一个像素的颜色为背景色.
    glClear(GL_COLOR_BUFFER_BIT);
    
    
    [self.buffer prepareToDrawWithAttrib:GLKVertexAttribPosition numberOfCoordinates:3 attribOfOffset:offsetof(ScenceVertex, positionCoords) shouldEnabled:YES];
    
    [self.buffer prepareToDrawWithAttrib:GLKVertexAttribTexCoord0 numberOfCoordinates:2 attribOfOffset:offsetof(ScenceVertex, textureCoords) shouldEnabled:YES];
    
    
    self.baseEffect.texture2d0.name = self.info1.name;
    self.baseEffect.texture2d0.target = self.info1.target;
    
    [self.baseEffect prepareToDraw];
    
    
    [self.buffer drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:6];
    
    
    
    self.baseEffect.texture2d0.name = self.info2.name;
    self.baseEffect.texture2d0.target = self.info2.target;
    
    [self.baseEffect prepareToDraw];
    
    
    [self.buffer drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:6];
//
//    //4.启用顶点数据
//    glEnableVertexAttribArray(GLKVertexAttribPosition);
//    
//    //5.设置指针
//    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(ScenceVertex), NULL);
//
//
//    //画图
//    glDrawArrays(GL_TRIANGLES, 0, 3);
    
//    [self prepareToDrawWithAttrib:GLKVertexAttribPosition AttribStride:sizeof(ScenceVertex) numberOfCoordinates:3 attribOfOffset:offsetof(ScenceVertex, positionCoords) shouldEnable:YES];
//    [self prepareToDrawWithAttrib:GLKVertexAttribTexCoord0 AttribStride:sizeof(ScenceVertex) numberOfCoordinates:2 attribOfOffset:offsetof(ScenceVertex, textureCoords) shouldEnable:YES];
//    
//
//    [self drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:3];
//    

}


最后合成图片如下

原始图片1
原始图片2
混合后的图片

持续更新中......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容