在OpenGL ES中调整由投影仪引起的失真

Adjusting the distortion caused by a projector in OpenGL ES

本文关键字:失真 投影仪 OpenGL ES 调整      更新时间:2023-10-16

我开始使用在树莓派上运行的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调用返回,但它是更容易和干净,只是保持它在你的代码。