android opengl oes 纹理渲染到 gl_texture_2d
时间: 2024-01-03 20:01:37 浏览: 220
Android中可以使用OpenGL ES对纹理进行渲染。在OpenGL ES中,纹理对象是通过生成纹理ID,绑定纹理,加载纹理数据并设置纹理参数来进行操作的。
首先,需要生成一个纹理ID,可以使用glGenTextures方法来生成一个纹理ID。然后,通过glBindTexture方法将纹理ID绑定到纹理目标上,例如GL_TEXTURE_2D。
接下来,可以使用glTexImage2D方法加载纹理数据。在加载纹理之前,需要将纹理数据转换为OpenGL ES所支持的格式。可以使用BitmapFactory加载图片,并将其转换为与纹理目标兼容的格式,如RGBA。
在加载纹理数据时,还需要设置一些纹理参数,例如纹理过滤模式和纹理环绕模式。可以使用glTexParameteri方法来设置这些参数。
最后,在进行渲染时,需要将纹理绑定到纹理单元上,并在着色器中使用纹理坐标获取纹理数据。可以使用glActiveTexture方法将纹理单元激活,并使用glBindTexture方法将纹理对象绑定到纹理单元上。
总之,通过生成纹理ID,绑定纹理目标,加载纹理数据并设置纹理参数,可以将纹理渲染到gl_texture_2d中。在渲染时,还需要将纹理绑定到纹理单元上,并在着色器中使用纹理坐标获取纹理数据。这样,就可以实现纹理渲染到gl_texture_2d的功能。
相关问题
GL_TEXTURE_2D and GL_TEXTURE_EXTERNAL_OES的使用场景
GL_TEXTURE_2D是OpenGL ES中最常用的2D纹理目标类型,用于渲染2D图像。它可以用于存储和渲染普通2D图像,例如JPEG、PNG等格式的图片,也可以用于存储和渲染视频帧。
GL_TEXTURE_EXTERNAL_OES是OpenGL ES扩展中的一种纹理目标类型,用于渲染由外部OES(EGL_IMAGE_EXTERNAL_OES)纹理产生的图像。它主要用于Android系统中的OpenMAX组件中,如硬件解码器和相机预览等,因为这些组件产生的纹理是OES类型的。
在Android系统中,通常使用GL_TEXTURE_EXTERNAL_OES纹理目标来渲染相机预览帧和视频帧,因为相机预览和视频帧通常以OES类型的纹理形式出现。而对于普通的2D图像,通常使用GL_TEXTURE_2D纹理目标来渲染。因此,在OpenGL ES中,选择使用GL_TEXTURE_2D还是GL_TEXTURE_EXTERNAL_OES纹理目标,取决于所要渲染的图像类型。
android opengl模糊,Android:双重渲染使用OpenGL渲染到SurfaceTexture
要实现模糊效果,可以使用双重渲染技术,即将OpenGL渲染到SurfaceTexture,再将SurfaceTexture渲染到屏幕上。
下面是一个简单的示例代码:
1. 首先,在XML布局文件中添加一个TextureView:
```
<TextureView
android:id="@+id/textureView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
2. 在Activity中获取TextureView并设置监听器:
```
private TextureView textureView;
private SurfaceTexture surfaceTexture;
private int textureId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textureView = findViewById(R.id.textureView);
textureView.setSurfaceTextureListener(surfaceTextureListener);
}
private TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
surfaceTexture = surface;
textureId = createTexture();
startRender();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
stopRender();
surfaceTexture = null;
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
```
3. 创建OpenGL纹理:
```
private int createTexture() {
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
int textureId = textures[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
return textureId;
}
```
4. 开始渲染:
```
private RenderThread renderThread;
private void startRender() {
if (renderThread == null) {
renderThread = new RenderThread();
renderThread.start();
}
}
private void stopRender() {
if (renderThread != null) {
renderThread.stopRender();
renderThread = null;
}
}
private class RenderThread extends Thread {
private volatile boolean isRender = true;
@Override
public void run() {
super.run();
EglCore eglCore = new EglCore();
WindowSurface windowSurface = new WindowSurface(eglCore, surfaceTexture);
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
while (isRender) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
// 在这里进行OpenGL渲染操作
windowSurface.swapBuffers();
}
windowSurface.release();
eglCore.release();
}
public void stopRender() {
isRender = false;
}
}
```
5. 最后,在onDrawFrame方法中进行双重渲染:
```
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
// 在这里进行OpenGL渲染操作
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
surfaceTexture.updateTexImage();
// 将SurfaceTexture渲染到屏幕上
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glViewport(0, 0, getWidth(), getHeight());
GLES20.glUseProgram(programId);
int uTextureSamplerLocation = GLES20.glGetUniformLocation(programId, "uTextureSampler");
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
GLES20.glUniform1i(uTextureSamplerLocation, 0);
GLES20.glEnableVertexAttribArray(aPositionLocation);
GLES20.glVertexAttribPointer(aPositionLocation, 2, GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(aTextureCoordLocation);
GLES20.glVertexAttribPointer(aTextureCoordLocation, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
GLES20.glDisableVertexAttribArray(aPositionLocation);
GLES20.glDisableVertexAttribArray(aTextureCoordLocation);
}
```
阅读全文