【问题标题】:2D Texture morph in Ortographic Projection正交投影中的 2D 纹理变形
【发布时间】: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


    【解决方案1】:

    您需要使用透视投影来达到预期的效果。查看here 的示例代码,用于使用 glm 创建透视投影矩阵。

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

    EDIT:在您的代码中,我可以在哪里查看 .frustum.translate 方法或来自什么库 projection强>对象是?看起来您不是在通过移动截锥矩阵进行投影 * 查看。 Some info 关于标准矩阵的角色。

    如果您在屏幕上出现黑色而不是 GL_COLOR_BUFFER_BIT,请考虑调试。颜色问题不是矩阵,而是更早。我还建议控制台记录您的透视矩阵并将其与正确的矩阵进行比较(例如,您可以在 glm 库中获得)。

    【讨论】:

    • 感谢您的回答;我已经更新了我上面的帖子并添加了一个平截头体视角......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2014-01-10
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多