OPENGL ES 纹理

  1. 相关概念
    纹理坐标系:
    纹理坐标系

    纹素:当用一个图像初始化一个纹理缓存之后,在这个图像中的每个像素变成了纹理中 的一个纹素(texel)。从一个 1 像素高 64 像素 的图像初始化来的纹理会沿着整个T轴有1纹素 , 着S轴有64纹素 。

    片元:帧缓存中的颜色像素

    视口坐标:帧缓存中像素的位置。 转换为视口坐标的结果是 所有绘制的几何图形都 被拉伸以适合屏幕大小

  2. 纹理生成

   CGImageRef imageRef0 = 
      [[UIImage imageNamed:@"leaves.gif"] CGImage];

   GLKTextureInfo *textureInfo0 = [GLKTextureLoader 
      textureWithCGImage:imageRef0 
      options:[NSDictionary dictionaryWithObjectsAndKeys:
         [NSNumber numberWithBool:YES], 
         GLKTextureLoaderOriginBottomLeft, nil] 
      error:NULL];

   //用于标示哪个纹理
   self.baseEffect.texture2d0.name = textureInfo0.name;

   //target 这里是 GL_TEXTURE_2D
   self.baseEffect.texture2d0.target = textureInfo0.target;
   self.baseEffect.texture2d0.enabled = GL_TRUE;

    //配置混合模式,多重纹理时使用
    self.baseEffect.texture2d1.envMode = GLKTextureEnvModeDecal;

    /*配置混合模式,也可以使用openGL的方法
        //开启混合
        glEnable(GL_BLEND)
        //设置混合
        //glBlendFunc(sourceFactor,destinationFactor)
        //sourceFactor 参数用于指定每个片元的最终颜色元素是怎么影响混合的。
        //destinationFactor  参数用于指定在目标帧缓存中已经存在的颜色元素会怎么影响混合。
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
    */
  1. 纹理设置
/*glTexParameteri (GLenum target, GLenum pname, GLint param);

target:GL_TEXTURE_2D等
pname: 参数名
param:参数值
*/

//取样模式
/*参数GL_TEXTURE_MIN_FILTER 多个纹素对应一个片元时怎么处理
    GL_LINEAR:从相配的多个纹素中取样颜色,然后使用线性内插法来混合这些颜色以得到片元的颜色。
    GL_NEAREST:与片元的U、V 坐标最接近的纹素的颜色会被取样
*/

/*参数GL_TEXTURE_MAG_FILTER 没有足够的纹素唯一映射到每个片元上
    GL_LINEAR:混合附近纹素的颜色来计算片元的颜色。会有一个放大纹理的效果,并会让它模糊地出现在渲染的三角形上。  
    GL_NEAREST:拾取与片元的 U、V 位置接近的纹素的颜色, 并放大纹理。会使它有点像素化地出现在渲染的三角形上。
*/
    glTexParameteri(
      GL_TEXTURE_2D,
      GL_TEXTURE_MIN_FILTER, 
      GL_NEAREST);


//循环模式

//S轴超出后,循环读取
    glTexParameteri(
      GL_TEXTURE_2D,
      GL_TEXTURE_WRAP_S, 
      GL_REPEAT);
//T轴超出后,取纹理边缘的纹素
    glTexParameteri(
      GL_TEXTURE_2D,
      GL_TEXTURE_WRAP_T, 
      GL_CLAMP_TO_EDGE);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL ES中,纹理数组是一组纹理的集合,可以一次性加载多个纹理并进行处理。使用纹理数组可以提高渲染效率,减少内存占用。 纹理数组的创建和使用主要有以下几个步骤: 1. 创建纹理数组对象:使用glGenTextures函数创建纹理数组对象,并使用glBindTexture函数绑定到OpenGL ES上下文中。 2. 加载纹理数据:使用glTexImage2D函数将纹理数据加载到纹理数组中。 3. 设置纹理参数:使用glTexParameter函数设置纹理参数,如过滤模式、纹理环绕模式等。 4. 绑定纹理数组:使用glBindTexture函数将纹理数组绑定到OpenGL ES上下文中。 5. 使用纹理数组:在渲染时,使用glActiveTexture函数激活纹理单元,并使用glBindTexture函数将纹理数组绑定到激活的纹理单元上,然后在着色器中使用sampler2DArray类型的变量进行采样。 需要注意的是,在使用纹理数组时,每个纹理的大小和格式必须相同。 下面是一个使用纹理数组的示例代码: ``` GLuint texArray; glGenTextures(1, &texArray); glBindTexture(GL_TEXTURE_2D_ARRAY, texArray); glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, width, height, numTextures, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_ARRAY, texArray); glUniform1i(textureLoc, 0); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值