Ortographic Projection中的2D纹理变形

时间:2015-10-07 13:15:47

标签: opengl textures depth orthographic

我很难弄清楚我的纹理发生了什么:

基本上我在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

这些函数将当前矩阵与您定义为参数的矩阵相乘,这应该产生与我定义View矩阵相同的结果,然后定义我的着色器制服" mvp_matrix"作为投影*视图,如果我没有弄错的话。也许像lookAt之类的东西可以做到这一点;我会尝试更多地搞乱。 :)

1 个答案:

答案 0 :(得分:0)

您需要使用透视投影来获得所需的结果。查看here以获取使用glm创建透视投影矩阵的示例代码。

不需要移动顶点,因为您将获得在模型矩阵中应用旋转的正确位置。

编辑:在您的代码中,我可以查看 .frustum .translate 方法,或者从哪个库投影对象是?通过移动平截头体矩阵,您看起来不像是在进行投影*视图。 Some info关于标准矩阵的作用。

考虑调试如果你使用屏幕黑色而不是 GL_COLOR_BUFFER_BIT 颜色问题不是矩阵但是更早。另外,我建议你在console.log中使用你的透视矩阵并将其与正确的矩阵进行比较(你可以在 glm 库中找到它)。