树莓派上使用OpenGL ES在绘制前旋转纹理的实现方法
针对树莓派simple2d库缺失纹理旋转功能的解决方案
我太懂这种尴尬了——树莓派的GPU只支持OpenGL ES,搜相关资料的时候翻十页有九页都是Android和iOS的内容,想找适配树莓派VideoCore IV的实用方案真的得费不少劲。你选的simple2d确实是个省心的封装库,把底层的OpenGL ES接口藏得好好的,结果偏偏缺了你完成任务最关键的纹理旋转功能。
这里给你两个可行的解决思路:
1. 给simple2d源码添加旋转支持
既然simple2d是开源的,直接修改它的代码来补全功能是最彻底的办法:
- 定位到库中负责纹理渲染的模块(一般是
texture.c或者类似命名的文件) - 在纹理绘制的代码块前,插入OpenGL ES的矩阵旋转逻辑:
// 切换到模型视图矩阵 glMatrixMode(GL_MODELVIEW); glPushMatrix(); // 保存当前矩阵状态,避免影响其他绘制 // 设置旋转中心为纹理中心(w是纹理宽度,h是纹理高度) glTranslatef(w / 2.0f, h / 2.0f, 0.0f); // 旋转90度(可以替换成你需要的角度),绕Z轴旋转 glRotatef(90.0f, 0.0f, 0.0f, 1.0f); glTranslatef(-w / 2.0f, -h / 2.0f, 0.0f); - 在纹理绘制完成后,记得恢复之前的矩阵状态:
glPopMatrix();
2. 不修改库,在业务代码中插入原生OpenGL ES操作
如果不想动库的源码,也可以在调用simple2d的纹理绘制函数前后,手动插入矩阵操作:
- 在调用
S2D_DrawTexture(或者simple2d中对应的绘制函数)之前,执行上面提到的矩阵旋转代码 - 绘制完成后执行
glPopMatrix()恢复状态,这样其他用simple2d绘制的内容就不会被影响
最后给你个小搜索技巧:以后找树莓派OpenGL ES资料时,加上Raspberry Pi VideoCore IV或者Broadcom OpenGL ES关键词,能过滤掉大量移动端的无关内容,更快找到适配树莓派的文档。
内容的提问来源于stack exchange,提问作者Thomas




