【发布时间】:2016-01-04 17:52:22
【问题描述】:
我很难弄清楚我的纹理是怎么回事:
基本上,我在 OpenGL 中获取一个网络摄像头流作为我的底层 2d 纹理画布,并在我的 paintGL() 中在其上绘制东西(作为带有 GL_BLEND 的 RGBA 图像)。 由于我使用 Kinect 作为数据源,因此我还从被跟踪的骨架(人)中获取深度值,并将它们转换为 GL 值(XYZ 在 0.0f 和 1.0f 之间变化)。 所以我的目标是,例如,加载的 2D 纹理(如衬衫)现在可以正确跟踪我的 RGB 输出显示中的人。但看来我对正交投影的理解是错误的:
我不断地将 4 个转换后的顶点加载到 VBO 中,但是每当我将纹理放在这个动态四边形的顶部时,它总是面向屏幕。 我认为将这个动态四边形放在“背景”画布和相机之间会导致四边形正确投影到画布上,这会给我一种扭曲的 2D 纹理的印象,这似乎在人时“弯曲”旋转。
但纹理始终面向相机且不旋转。 我还尝试通过矩阵手动旋转并将其设置到我的着色器中,但同样,它只旋转顶点四边形本身(因为:旋转只会使纹理更小),然后将纹理放在顶部,而不是旋转带有它的纹理。
那么,是否有可能以某种方式正确地将其应用于纹理? 我曾考虑过在其中混合透视投影,但实际上不知道如何实现这个......
编辑: 我实际上已经将我的投影矩阵设置如下:
在resizeGL()中:
projection.setToIdentity();
projection.ortho(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
projection.translate(0.0f, 0.0f, 3.0f);
在paintGL()中:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST); // turning this on/off makes no difference
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, &textureID);
program.setUniformValue("mvp_matrix", projection);
program.setUniformValue("texture", 0);
//draw 2d background quad
drawQuad();
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// switch to frustum to give perspective view
projection.setToIdentity();
projection.frustum(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
projection.translate(0.0f, 0.0f, 3.0f);
// bind cloth texture and draw ontop 2d quad
clothTexture->bind();
program.setUniformValue("mpv_matrix", projection);
drawShirtQuad();
// reset to ortho view
projection.setToIdentity();
projection.ortho(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
// release texture
clothTexture->release();
glDisable(GL_BLEND);
clothTexture 是一个 QOpenGLTexture,它已经成功地从一个文件中加载了一个 RGBA 图像。 结果:每当我激活平截头体透视图时,都会导致黑屏。我认为一切都设置正确:POV 在 resizeGL() 中向 z 轴正方向移动,所有布料顶点在 XYZ 中在 0 和 1 之间变化,而背景位于:
(0.0f, 0.0f, -1.0f), (1.0f, 0.0f, -1.0f), (1.0f, 1.0f, -1.0f), (0.0f, 1.0f, -1.0f) .
所以布料对象总是位于背景平面和 POV 之间。我在截锥体设置中遗漏了什么吗?我只是简单地设置它的方式与邻...
编辑: 抱歉没有提及;我使用的矩阵是 QMatrix4x4 类型: Frustum
这些函数将当前矩阵与您定义为参数的矩阵相乘,这应该产生与我定义视图矩阵相同的结果,然后将我的着色器统一“mvp_matrix”定义为投影*视图,如果我'我没有弄错。也许像lookAt 这样的东西可以解决问题;我会尝试更多地胡闹。 :)
【问题讨论】:
标签: opengl textures depth orthographic