我正在尝试将手机摄像头的输出流式传输到屏幕上。如果使用 IwGx 将此输出绘制到四边形上,它会比写入 s3eSurfacePtr 更快吗?
我听说有些人通过使用 OpenGL 将他们的 2d 图像渲染到四边形来创建游戏,而且速度更快(因为 GPU 加速?)。有谁知道这是不是真的?这似乎与我上面的问题相似。
是的,我肯定会走 IwGx 路线。s3eSurface 在现代硬件(尤其是 iOS 平台)上可能非常慢。
首先创建一个 CIwTexture 实例,禁用 mip 贴图并使其可修改。
CIwTexture* lpTexture = new CIwTexture;
lpTexture->SetModifiable(true);
lpTexture->SetMipMapping(false);
初始化回调方法
s3eCameraRegister(S3E_CAMERA_UPDATE_STREAMING, (s3eCallback) MyFrameDataCallback, NULL);
启动相机运行,并要求它在接收到帧时转换为 RGB565。您应该根据您的使用情况改变请求的大小和质量提示。这有点反复试验,因为它取决于硬件支持的内容。
s3eCameraStart(S3E_CAMERA_STREAMING_SIZE_HINT_LARGEST, S3E_CAMERA_PIXEL_TYPE_RGB565_CONVERTED, S3E_CAMERA_STREAMING_QUALITY_HINT_HIGH);
然后在相机帧回调中更新纹理
lpTexture->CopyFromBuffer(apFrame->m_Width, apFrame->m_Height, CIwImage::RGB_565, apFrame->m_Pitch, (uint8*) apFrame->m_Data, 0);
lpTexture->Upload();
apFrame 是指向作为第一个参数传递给回调函数的 s3eCameraFrameData 结构的指针。您需要在回调中进行复制,因为一旦回调完成,数据将不复存在,但您可能希望推迟上传,以便在应用程序的每个循环中只执行一次。
现在你需要做的就是创建一个 CIwMaterial,让它使用上面的纹理并在屏幕上渲染一个带纹理的四边形。我将把代码留给你,因为它非常简单!