OpenGL ES 纹理 Webrtc

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,getTextureId());

void glBindTexture(GLenum  target, GLuint  texture);

target

指明了纹理要绑定到的目标。必须是下面中的一个:GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BUFFER, GL_TEXTURE_2D_MULTISAMPLE 或者 GL_TEXTURE_2D_MULTISAMPLE_ARRAY

纹理常用类型:GLES20.GL_TEXTURE_2D

GLES11Ext.GL_TEXTURE_EXTERNAL_OES,这是Android特有的OES纹理,预览相机或者视频使用此纹理。

通用 2D 纹理 shader

顶点shader:

attribute vec4 vPosition;
attribute vec2 vCoord;
uniform mat4 vMatrix;

varying vec2 textureCoordinate;

void main(){
    gl_Position = vMatrix*vPosition;
    textureCoordinate = vCoord;
}

片元:

precision mediump float;
varying vec2 textureCoordinate;
uniform sampler2D vTexture;
void main() {
    gl_FragColor = texture2D( vTexture, textureCoordinate );
}

//oem

attribute vec4 vPosition;
attribute vec2 vCoord;
uniform mat4 vMatrix;
uniform mat4 vCoordMatrix;
varying vec2 textureCoordinate;

void main(){
    gl_Position = vMatrix*vPosition;
    textureCoordinate = (vCoordMatrix*vec4(vCoord,0,1)).xy;
}

片元:

#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 textureCoordinate;
uniform samplerExternalOES vTexture;
void main() {
    gl_FragColor = texture2D( vTexture, textureCoordinate );
}

Webrtc 中关于纹理绘制 android设备 为OES 

绘制也很简单 

### 使用 OpenGL 实现 WebRTC 合屏功能 为了实现在移动设备上使用 OpenGL ES 将本地视频流和远程视频流合成在一个视图中展示的功能,通常会涉及到多个步骤的操作。这里提供一种基于 Android 平台的方法来完成这一目标。 #### 准备工作 在开始之前,确保已经设置了合适的开发环境,并且能够访问 WebRTC SDK 和必要的 OpenGL 开发库。对于 Android 应用来说,这可能意味着已经在项目里集成了 WebRTC 的 native 组件以及配置好了 NDK 支持以便于编写 C++ 代码[^3]。 #### 创建 SurfaceViewRenderers 创建两个 `SurfaceViewRenderer` 对象分别用来呈现本地和远端的视频画面: - **Local Video Renderer**: 设置宽度高度匹配手机屏幕尺寸。 - **Remote Video Renderer**: 定义固定的小窗口大小(例如120&times;160),并通过布局属性使其位于本地视频上方顶部位置显示。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Local video renderer --> <org.webrtc.SurfaceViewRenderer android:id="@+id/local_video_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- Remote video renderer with specific size and position --> <org.webrtc.SurfaceViewRenderer android:id="@+id/remote_video_view" android:layout_width="120dp" android:layout_height="160dp" android:layout_gravity="top|center_horizontal"/> </RelativeLayout> ``` #### 初始化 View 及 PeerConnection 接下来,在 Java 或 Kotlin 层面初始化这两个 `SurfaceViewRenderer` 控件,并建立与对方之间的连接即创建 `PeerConnection` 实例[^1]。 ```java // Initialize local and remote render views. localVideoView = findViewById(R.id.local_video_view); remoteVideoView = findViewById(R.id.remote_video_view); EglBase rootEglBase = EglBase.create(); localVideoView.init(rootEglBase.getEglBaseContext(), null); remoteVideoView.init(rootEglBase.getEglBaseContext(), null); peerConnectionFactory.initialize(); // Create peer connection... createPeerConnection(); ``` #### 处理纹理数据传输至 GPU 当接收到新的帧时,WebRTC 会自动处理将图像从 CPU 内存拷贝到 GPU 上的过程。一旦到达 GPU,则可以通过 OpenGL ES 渲染管线进一步操作这些图像资源。 #### 自定义着色器进行合屏效果 为了让两路视频能够在同一个界面上合理地共存而不互相干扰,可以自定义 fragment shaders 来控制不同区域的颜色混合方式。比如简单的 alpha blending 技术就可以很好地解决这个问题。 下面是一个非常基础的例子展示了如何利用 GLSL 编写片段着色器来进行透明度叠加的效果: ```glsl precision mediump float; uniform sampler2D uTextureUnit; // Texture unit containing the texture to be rendered. varying vec2 vTexCoordOut; // Interpolated texture coordinate passed from vertex shader. void main(){ gl_FragColor = texture2D(uTextureUnit, vTexCoordOut); } ``` 实际应用中可能会更复杂一点,因为需要考虑不同的输入源比例调整等因素。但是核心思路就是通过修改顶点坐标系或者改变采样坐标的偏移量等方式达到预期视觉效果。 #### 错误检测机制 考虑到并非所有的 OpenGL 驱动都完全兼容所有特性组合的情况,因此建议定期调用 `glCheckFramebufferStatus()` 方法验证当前使用的 framebuffer 是否有效。如果不支持的话则尝试切换其他替代方案或提示用户更新图形驱动程序版本[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值