iOS技术

OpenGL ES学习笔记4:混合和多重纹理

2017-03-01  本文已影响1012人  南华coder

<h5>一、先上效果图</h5>

混合.png

<h5>二、混合 的 主要代码</h5>

- (void)setupTextureInfo{

    CGImageRef imageRef0 = [[UIImage imageNamed:@"leaves.gif"] CGImage];
    self.textureInfo0 = [GLKTextureLoader textureWithCGImage:imageRef0 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    CGImageRef imageRef1 = [[UIImage imageNamed:@"beetle.png"] CGImage];
    self.textureInfo1 = [GLKTextureLoader textureWithCGImage:imageRef1 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    self.baseEffect = [[GLKBaseEffect alloc] init];

    glEnable(GL_BLEND);  //开启混合
    //表示把渲染的图像融合到目标区域。也就是说源的每一个像素的alpha都等于自己的alpha,
    //目标的每一个像素的alpha等于1减去该位置源像素的alpha。 因此不论叠加多少次,亮度是不变的。
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{

    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);

   self.baseEffect.texture2d0.name = self.textureInfo0.name;
    self.baseEffect.texture2d0.target = self.textureInfo0.target;
    [self.baseEffect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, 6);

    self.baseEffect.texture2d0.name = self.textureInfo1.name;
    self.baseEffect.texture2d0.target = self.textureInfo1.target;
    [self.baseEffect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, 6);
}

<h6>代码说明</h6>

混合方程.png
混合参数 描述
GL_ZERO 使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算
GL_ONE 使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算
GL_SRC_ALPHA 表示使用源颜色的alpha值来作为因子
GL_DST_ALPHA 表示使用目标颜色的alpha值来作为因子
GL_ONE_MINUS_SRC_ALPHA 表示用1.0减去源颜色的alpha值来作为因子

<h5>三、多重纹理</h5>

多重纹理混合模式 描述
GLKTextureEnvModeReplace 给第二个纹理设置该模式,只显示第二个纹理
GLKTextureEnvModeModulate 默认使用,几乎总是产生最好的结果。它会让所有的为灯光和其他效果计算出来的颜色与从一个纹理取样的颜色相混合。
GLKTextureEnvModeDecal 开启多重纹理,启用一个和 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)类似的方程式来混合两个纹理

<h5>四、多重纹理 之 主要代码</h5>

- (void)setupMultipleTexture{

    CGImageRef imageRef0 = [[UIImage imageNamed:@"leaves.gif"] CGImage];
    self.textureInfo0 = [GLKTextureLoader textureWithCGImage:imageRef0 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    CGImageRef imageRef1 = [[UIImage imageNamed:@"beetle.png"] CGImage];
    self.textureInfo1 = [GLKTextureLoader textureWithCGImage:imageRef1 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    self.baseEffect = [[GLKBaseEffect alloc] init];

    self.baseEffect.texture2d0.name = self.textureInfo0.name;
   self.baseEffect.texture2d0.target = self.textureInfo0.target;

    self.baseEffect.texture2d1.name = self.textureInfo1.name;
    self.baseEffect.texture2d1.target = self.textureInfo1.target;
    self.baseEffect.texture2d1.envMode = GLKTextureEnvModeDecal;
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{

    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.baseEffect prepareToDraw];

    glDrawArrays(GL_TRIANGLES, 0, 6);
}

代码直通车:QSOpenGLES002_BlendTexture

篇外:纹理后续部分:关于自定义纹理和纹理压缩的内容,先填个坑,继续下一主题(光线)的学习。

上一篇 下一篇

猜你喜欢

热点阅读