1111
1212那么在 OpenGLES 中,*** 纹理实际上是一个可以被采样的复杂数据集合,是 GPU 的图像数据结构,纹理分为 2D 纹理、 立方图纹理和 3D 纹理。***
1313
14- 2D 纹理是 OpenGLES 中最常用和最常见的纹理形式,是一个图像数据的二维数组。纹理中的一个单独数据元素称为纹素或纹理像素。
14+ *** 2D 纹理是 OpenGLES 中最常用和最常见的纹理形式,是一个图像数据的二维数组。纹理中的一个单独数据元素称为纹素或纹理像素。***
1515
1616立方图纹理是一个由 6 个单独的 2D 纹理面组成的纹理。立方图纹理像素的读取通过使用一个三维坐标(s,t,r)作为纹理坐标。
1717
@@ -129,9 +129,29 @@ OpenGL不能直接加载jpg或者png这类被编码的压缩格式,需要加
129129
130130### 纹理过滤
131131
132+ 纹理坐标不依赖于分辨率,它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素映射到纹理坐标。
133+
134+ 当你有一个很大的物体但是纹理的分辨率很低的时候这就变得很重要了。
135+
136+
132137当我们通过光栅化将图形处理成一个个小片段的时候,再将纹理采样,渲染到指定位置上时,通常会遇到纹理元素和小片段并非一一对应。
133138这时候,会出现纹理的压缩或者放大。那么在这两种情况下,就会有不同的处理方案,这就是纹理过滤了。
134139
140+
141+ 纹理过滤有很多选项,这里只说最重要的两项: GL_NEAREST和GL_LINEAR。
142+
143+ - GL_NEAREST: 临近过滤,是OpenGL默认的纹理过滤方式,会选择中心点最接近纹理坐标的那个像素。
144+
145+ - GL_LINEAR: 线性过滤,会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。一个纹理像素的中心距离纹理坐标越近,那么这个纹理像素的颜色对最终的样本颜色的贡献越大。
146+
147+
148+
149+ 如果在一个很大的物体上应用一张低分辨率的纹理会发生什么呢(纹理被放大了,每个纹理像素都能看到)?
150+
151+ GL_NEAREST产生了颗粒状的图案,我们能够清晰看到组成纹理的像素。
152+ 而GL_LINEAR能够产生更平滑的图案,很难看出单个的纹理像素。GL_LINEAR可以产生更真实的输出。
153+
154+
135155### 纹理对象和纹理的加载
136156
137157纹理应用的第一步是创建一个纹理对象。纹理对象是一个容器对象,保存渲染所需的纹理数据,例如图像数据、过滤模式和包装模式。
@@ -352,7 +372,7 @@ color = texture(samp, tc);
352372纹理的绘制:
353373
354374``` java
355- // 激活纹理 ,设置当前活动的纹理单元为单元0
375+ // 激活纹理单元 ,设置当前活动的纹理单元为单元0
356376GLES30 . glActiveTexture(GLES30. GL_TEXTURE0 );
357377// 绑定纹理,将纹理id绑定到当前活动的纹理单元上
358378GLES30 . glBindTexture(GLES30. GL_TEXTURE_2D , textureId);
@@ -365,6 +385,10 @@ GLES20.glUniform1i(aTextureLocation, 0);
365385通过纹理单元赋值给采样器,我们可以一次绑定多个纹理,只要我们在使用的时候激活纹理。
366386
367387
388+ OpenGL至少保证有16个纹理单元供你使用,也就是说你可以激活从GL_TEXTURE0到GL_TEXTURE15。
389+ 它们都是按顺序定义的,所以我们也可以通过GL_TEXUTURE0 + 8的方式获得GL_TEXTURE8,这在需要循环一些纹理单元的时候会很有用。
390+
391+
368392``` java
369393 public class TextureRender extends BaseGLSurfaceViewRenderer {
370394 private final FloatBuffer vertextBuffer;
0 commit comments