Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正确使用QT包装器上载3D纹理_C++_Qt_Opencv_Opengl - Fatal编程技术网

C++ 正确使用QT包装器上载3D纹理

C++ 正确使用QT包装器上载3D纹理,c++,qt,opencv,opengl,C++,Qt,Opencv,Opengl,我正在尝试使用QT包装器从OpenCV 3D矩阵上传纹理 这是我的代码(包括测试): 我正试图解决这个问题,但没有成功。任何线索都将不胜感激。谢谢。您创建并填充了一个QOpenGLTexture对象,但是OpenGL管道实际上并没有开始使用该对象,除非您将其绑定到准备渲染的单元。根据可渲染对象的不同,应将其称为m_纹理->绑定()或m_纹理->绑定(uint单位) 第二次打印输出垃圾值,因为以下行尝试从空纹理读取到大小为m\u vol\u data.total()的无符号字符数组中 有关该类的更

我正在尝试使用QT包装器从OpenCV 3D矩阵上传纹理

这是我的代码(包括测试):


我正试图解决这个问题,但没有成功。任何线索都将不胜感激。谢谢。

您创建并填充了一个
QOpenGLTexture
对象,但是OpenGL管道实际上并没有开始使用该对象,除非您将其绑定到准备渲染的单元。根据可渲染对象的不同,应将其称为
m_纹理->绑定()
m_纹理->绑定(uint单位)

第二次打印输出垃圾值,因为以下行尝试从空纹理读取到大小为
m\u vol\u data.total()
无符号字符数组中

有关该类的更多文档,请参阅

 unsigned char * buffer = new unsigned char[m_vol_data.total()];
    for (int i = 0; i < m_vol_data.size[0]; i ++)
        for (int j = 0; j < m_vol_data.size[1]; j ++)
            for (int k= 0; k < m_vol_data.size[2]; k ++)
            {
                buffer[i + m_vol_data.size[0] * (j + m_vol_data.size[2] * k)] = m_vol_data.at<uint8_t>(i, j, k);
//                      printf("%d, %d \n", m_vol_data.at<uint8_t>(i, j, k),buffer[i + m_vol_data.size[0] * (j + m_vol_data.size[2] * k)]);
            }

    m_texture = new QOpenGLTexture(QOpenGLTexture::Target3D);
    m_texture->setSize(m_vol_data.size[0], m_vol_data.size[1], m_vol_data.size[2]);
    m_texture->allocateStorage(QOpenGLTexture::Luminance, QOpenGLTexture::UInt8);
    m_texture->setData(QOpenGLTexture::Luminance, QOpenGLTexture::UInt8, buffer);
    m_vol_uploaded = true;

    unsigned char * check = new unsigned char[m_vol_data.total()];
    glGetTexImage(GL_TEXTURE_3D, 0, GL_RED, GL_UNSIGNED_BYTE, check);
    for (int i = 0; i < 100; i++)
        printf("%d\n", check[i]);
    std::cout << m_vol_data.total() << std::endl;
  m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, "#version 410 core\n"
                                                            "in vec4 vPosition;\n"
                                                            "uniform mat4 pMatrix;\n"
                                                            "uniform mat4 mvMatrix;\n"
                                                            "smooth out vec3 uv;\n"
                                                            "void main() {\n"
                                                            "   gl_Position = pMatrix * mvMatrix * vPosition;\n"
                                                            "   uv = (vPosition.xyz + vec3(1.0, 1.0, 1.0))/2.0;\n"
                                                            "}");
  m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, "#version 410 core\n"
                                                              "in vec3 uv;\n"
                                                              "uniform sampler3D tex;\n"
                                                              "out vec4 fragColor;\n"
                                                              "void main(){\n"
                                                              "  vec3 color = texture(tex, uv).rrr;\n"
                                                              "  fragColor.rgb = color;\n"
                                                              "};");
glGetTexImage(GL_TEXTURE_3D, 0, GL_RED, GL_UNSIGNED_BYTE, check);