首页 文章

在Ortographic Projection中的2D纹理变形

提问于
浏览
0

我很难弄清楚我的纹理是怎么回事:

基本上我是在OpenGL中获取网络摄像头流作为我的底层2D纹理画布,而在我的paintGL()中我正在绘制其中的东西(作为带有GL_BLEND的RGBA图像) . 由于我使用Kinect作为数据源,我也从跟踪的骨架(一个人)获取深度值,并将它们转换为GL值(XYZ在0.0f和1.0f之间变化) . 因此,我的目标是,例如,像衬衫一样加载的2D纹理现在可以正确跟踪RGB输出显示中的人物 . 但似乎我对正交投影的理解是错误的:

我经常将4个转换的顶点加载到VBO中,但每当我将纹理放在这个动态四边形的顶部时,它总是面向屏幕 . 我认为将这个动态四边形放在“背景”画布和相机之间会导致四边形在画布上的正确投影,这会给我一个翘曲的2D纹理的印象,这似乎每当人都“弯曲”旋转 .

但是面向相机的纹理是 always 并且没有旋转 . 我也尝试通过矩阵手动旋转并将其设置到我的着色器中,但同样,它只旋转顶点四边形(因为:旋转只会使纹理更小),然后将纹理放在顶部,而不是旋转用它的纹理 .

那么,是否有可能将其正确应用于纹理?我想过混合透视投影,但实际上根本不知道如何实现这个...

EDIT: 我实际上已经将我的投影矩阵设置如下:

在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之间 . 我在截头锥体设置中遗漏了什么吗?我只是设置它与正交...

EDIT: 抱歉没有提及;我正在使用的矩阵是QMatrix4x4类型:Frustum

这些函数将当前矩阵与您定义为参数的矩阵相乘,这应该产生与我定义View矩阵相同的结果,然后将我的着色器均匀"mvp_matrix"定义为投影*视图,如果我没有弄错的话 . 也许像lookAt这样的东西会起作用;我会尝试更多地搞乱 . :)

1 回答

  • 0

    您需要使用透视投影来获得所需的结果 . 查看here,例如使用glm创建透视投影矩阵的代码 .

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

    EDIT :在您的代码中,我可以在哪里查看 .frustum.translate 方法或从哪个库 projection 对象?它看起来不像你在做Projection *通过移动平截头体矩阵来查看 . Some info关于标准矩阵的作用 .

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

相关问题