在OpenGL ES中调整由投影仪引起的失真
Adjusting the distortion caused by a projector in OpenGL ES
我开始使用在树莓派上运行的OpenGL ES应用程序(c++/SDL),我想通过口袋投影仪输出。
我想让用户能够纠正由于投影仪从与表面不垂直的方向瞄准而引起的失真。表面也将小于投影面积。要做到这一点,用户将能够"移动"投影窗口的四个角独立匹配表面。
我计划通过解决一个简单的线性方程组来做到这一点,该方程组将原始角(在当前投影矩阵坐标中)转换为用户设置的角,并将这个结果矩阵推到GL_PROJECTION矩阵堆栈的顶部。
然而…我发现我不能在OpenGL ES中"读取"投影矩阵:
float matrix[16];
glGetFloatv(GL_PROJECTION_MATRIX, matrix);
特别是,GL_PROJECTION_MATRIX符号不存在…我甚至读到在OpenGL ES中没有投影矩阵这样的东西(我觉得很难相信,但我对它完全陌生,所以…)。
阅读这个矩阵的解决方案的任何想法,或者可能是一个替代的方法来做我想做什么?
谢谢!
OpenGL ESX有一个投影矩阵,你应该可以用问题中的代码得到当前的值。请参阅http://www.khronos.org/opengles/sdk/1.1/docs/man/glGet.xml以获取确认这一点的文档,或参阅http://www.khronos.org/registry/gles/api/GLES/gl.h的头文件。
ES 2.0及更高版本则是另一回事。ES 2.0消除了ES 1中存在的大部分固定管道。X,并替换为基于着色器的渲染
因此,像内置投影矩阵这样的概念在ES 2.0中不再存在,取而代之的是用GLSL编写的更灵活的着色程序概念。如果你想在ES 2.0中使用投影矩阵,你在顶点着色器代码中有一个矩阵变量,将矩阵的值传递给着色器程序(使用glUniformMatrix4fv
API调用),你为顶点着色器提供的GLSL代码执行向量与投影矩阵的乘法。
所以在ES 2.0的情况下,不需要对投影矩阵调用glGet*()
。如果你有一个,你计算它,并把它传递到着色器程序。这意味着你的代码中已经有了矩阵。好吧,你可以得到任何矩阵值与glGetUniformfv()
API调用返回,但它是更容易和干净,只是保持它在你的代码。
- 旋转模型矩阵时的形状失真
- 鱼眼镜头校准给出失真矩阵零
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 使用 cv::不扭曲不失真和居中图像
- HALCON到OpenCV失真系数的转换
- 处理文件期间输出失真.wav
- 如何检测监视器是否为投影仪
- OpenCV不失真点没有给出失真模型的精确逆
- 两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题
- 3D扫描仪深度失真
- CImg 库在旋转时创建失真的图像
- 使用OpenCV的无失真视频帧
- 图像失真与正弦双线性插值c++
- C++libpng到GLFWimage到GLFWcursor,导致失真和间歇性行为
- 了解OpenCV的不失真功能
- 食人魔投影仪透过物体发光
- 如何根据相机的矩阵和失真系数校正图像?
- OpenCV 中的重映射功能如何用于不失真的图像
- 使用 MATlab 访问投影仪
- 在OpenGL ES中调整由投影仪引起的失真