为什么 qopenglshader程序在 qt 中显示镜像
Why qopenglshaderprogram displaying mirror image in qt
我正在使用QQuickFramebufferObject在qml中使用opengl渲染视频,但输出我所看到的是原始镜像。
可能有什么问题。
法典:
QOpenGLShaderProgram *m_Program;
glGenTextures(3, m_Texture);
m_Program = new QOpenGLShaderProgram();
m_Program->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec4 a_position;"
"attribute vec2 a_texcoord;"
"varying vec2 v_texcoord;"
"void main()"
"{"
" gl_Position = a_position;"
" v_texcoord = a_texcoord;"
"}"
);
m_Program->addShaderFromSourceCode(QOpenGLShader::Fragment,
"varying vec2 v_texcoord;"
"uniform sampler2D u_Texture0;"
"uniform sampler2D u_Texture1;"
"uniform sampler2D u_Texture2;"
"uniform mat4 u_colorMatrix;"
"void main()"
"{"
" gl_FragColor = u_colorMatrix * vec4("
" texture2D(u_Texture0, v_texcoord).s,"
" texture2D(u_Texture1, v_texcoord).t,"
" texture2D(u_Texture2, v_texcoord).q,"
" 1.0);"
"}"
);
m_Program->bindAttributeLocation("a_position", 0);
m_Program->bindAttributeLocation("a_texcoord", 1);
m_Program->link();
static double prevPos = 0.0;
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
if(m_PlaneWidth == -1)
{
_clearView();
return;
}
m_Program->bind();
m_Program->enableAttributeArray(0);
m_Program->enableAttributeArray(1);
setPlayerPosition();
m_pw=m_ph=1.0;
float position[] =
{
m_pw, m_ph,
m_pw, -m_ph,
-m_pw, -m_ph,
-m_pw, m_ph
};
float w =1.0-(m_PlaneWidth-float(m_ptrMediator->getWidth()))/m_PlaneWidth;
float coord[] =
{
0.0, 1.0,
0.0, 0.0,
w, 0.0,
w, 1.0
};
m_Program->setAttributeArray(0, GL_FLOAT, position, 2);
m_Program->setAttributeArray(1, GL_FLOAT, coord, 2);
const qreal zNear = 1.0, zFar = 4.0, fov = 45.0;
const qreal aspect = m_ptrMediator->getWidth()/m_ptrMediator->getHeight();
m_Projection.setToIdentity();
m_Projection.perspective(fov, aspect, zNear, zFar);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
refresh(&pFrame);
m_Program->disableAttributeArray(0);
m_Program->release();
glActiveTextureARB(GL_TEXTURE2_ARB);
glBindTexture(GL_TEXTURE_2D, m_Texture[2]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pFrame->width,
pFrame->height, GL_LUMINANCE,
GL_UNSIGNED_BYTE, pFrame->data[0]);
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, m_Texture[1]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pFrame->width/2,
pFrame->height/2, GL_LUMINANCE,
GL_UNSIGNED_BYTE, pFrame->data[1]);
glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, m_Texture[0]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pFrame->width/2,
pFrame->height/2, GL_ALPHA,
GL_UNSIGNED_BYTE, pFrame->data[2]);
m_Program->setUniformValue("u_Texture0", 2/*m_Texture[2]-1*/);
m_Program->setUniformValue("u_Texture1", 1/*m_Texture[1]-1*/);
m_Program->setUniformValue("u_Texture2", 0/*m_Texture[0]-1*/);
m_Program->setUniformValue("u_colorMatrix", m_Conv);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
如果我改变位置,我可以看到一些变化,但我仍然没有得到实际数据。
有人可以帮助我摆脱困境吗
我只是修改了位置和纹理坐标,它开始工作。
m_pw=m_ph=1.0;
float position[] =
{
-m_pw, -m_ph,
m_pw, -m_ph,
m_pw, m_ph,
-m_pw, m_ph
};
float w =1.0-(m_PlaneWidth-float(m_ptrMediator->getWidth()))/m_PlaneWidth;
float coord[] =
{
0.0, 0.0,
w, 0.0,
w, 1.0,
0.0, 1.0
};
相关文章:
- 在python docker镜像上安装simstring(SWIG)
- 将移动设备(iOS和Android)连接到带有QT / C++和镜像显示的VNC服务器
- 将迭代器从原始容器镜像到其副本
- 更快的图像镜像算法
- C++;镜像并从 std::basic_istream<> 中穿过?
- VTK-如何翻转镜像
- 仅使用位操纵来获得镜像的六角形
- 为什么我的 iFFT 图像带有镜像副本
- 在此镜像代码中,可以是什么样的矩阵转换
- 函数来创建镜像c++
- 如何交换像素以镜像图像c++
- 减少每个像素的级别数,创建镜像,C++
- 为什么 qopenglshader程序在 qt 中显示镜像
- 如何镜像矩阵的一个维度
- 有什么方法可以在内部镜像Microsoft的符号服务器吗?
- 在OpenCV垫图像中显示Vec3b像素值
- 生成彼此不是镜像的排列
- 实现镜像
- 将控制台输出镜像到c++中的文件
- 创建具有特定格式的位图以反转/镜像该位图