我很难弄清楚我的纹理发生了什么:
基本上我在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之类的东西可以做到这一点;我会尝试更多地搞乱。 :)
答案 0 :(得分:0)