OpenGLES纹理处理与索引顶点渲染详解
立即解锁
发布时间: 2025-08-24 00:51:20 阅读量: 3 订阅数: 13 

### OpenGL ES纹理处理与索引顶点渲染详解
在OpenGL ES的图形渲染中,纹理处理是一个关键环节,它可以让我们的图形更加生动和真实。下面将详细介绍纹理过滤、纹理的创建与销毁、纹理的启用以及索引顶点的使用等重要内容。
#### 1. 纹理过滤
在使用纹理对象之前,我们需要定义纹理过滤方式。由于三角形在屏幕上占用的像素数量可能与纹理映射区域的像素数量不同,会出现放大(magnification)和缩小(minification)两种情况。
- **放大**:屏幕上使用的像素比从纹理映射中获取的像素多。
- **缩小**:屏幕上使用的像素比纹理映射区域的像素少。
在OpenGL ES中,我们通过`glTexParameterf()`方法来设置纹理的缩小和放大过滤器。示例代码如下:
```java
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
```
这里有两种过滤器类型可供选择:
- **GL10.GL_NEAREST**:总是选择纹理映射中最近的纹理元素(texel)映射到像素,会产生像素化的效果。
- **GL10.GL_LINEAR**:对三角形的一个像素采样四个最近的纹理元素并求平均值得到最终颜色,会产生平滑的效果。
#### 2. 纹理的创建、绑定与销毁
完成纹理过滤的设置后,我们还需要了解纹理的创建、绑定和销毁操作。
##### 2.1 纹理的创建与绑定
创建纹理对象、加载图像数据并设置过滤器的完整代码示例如下:
```java
Bitmap bitmap = BitmapFactory.decodeStream(game.getFileIO().readAsset("bobrgb888.png"));
int textureIds[] = new int[1];
gl.glGenTextures(1, textureIds, 0);
int textureId = textureIds[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
bitmap.recycle();
```
操作步骤如下:
1. 使用`BitmapFactory.decodeStream()`方法从资源中解码位图。
2. 调用`glGenTextures()`生成纹理ID。
3. 使用`glBindTexture()`绑定纹理对象。
4. 使用`GLUtils.texImage2D()`将位图数据上传到纹理对象。
5. 设置纹理过滤方式。
6. 解绑纹理对象,并回收位图以释放内存。
##### 2.2 纹理的销毁
如果不再需要纹理对象,可以使用以下代码将其从视频RAM中删除:
```java
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
int textureIds = { textureid };
gl.glDeleteTextures(1, textureIds, 0);
```
操作步骤:
1. 确保纹理对象未被绑定。
2. 调用`glDeleteTextures()`方法删除纹理对象。
#### 3. 启用纹理映射
在绘制带有纹理的三角形之前,我们需要绑定纹理并启用纹理映射。可以使用以下方法启用和禁用纹理映射:
```java
GL10.glEnable(GL10.GL_TEXTURE_2D);
GL10.glDisable(GL10.GL_TEXTURE_2D);
```
注意,启用和禁用顶点属性使用`glEnableClientState()`和`glDisableClientState()`,而对于其他OpenGL状态(如纹理映射),则使用`glEnable()`和`glDisable()`。
#### 4. 绘制带有纹理的三角形示例
以下是一个绘制带有纹理的三角形的完整示例代码:
```java
class TexturedTriangleScreen extends Screen {
final int VERTEX_SIZE = (2 + 2) * 4;
GLGraphics glGraphics;
FloatBuffer vertices;
int textureId;
public TexturedTriangleScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put( new float[] { 0.0f, 0.0f, 0.0f, 1.0f,
319.0f, 0.0f, 1.0f, 1.0f,
160.0f, 479.0f, 0.5f, 0.0f});
vertices.flip();
textureId = loadTexture("bobrgb888.png");
}
public int loadTexture(String fileName) {
try {
Bitmap bitmap = BitmapFactory.decodeStream(game.getFileIO().readAsset(fileName));
GL10 gl = glGraphics.getGL();
int textureIds[] = new int[1];
gl.glGenTextures(1, textureIds, 0);
int textureId = textureIds[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
bitmap.recycle();
return textureId;
} catch(IOException e) {
Log.d("TexturedTriangleTest", "couldn't load asset 'bobrgb888.png'!");
throw new RuntimeException("couldn't load asset '" + fileName + "'");
}
}
@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3
```
0
0
复制全文
相关推荐









