2017-01-18 2 views
0

QTラッパーを使用してOpenCV 3Dマトリックスからテクスチャをアップロードしようとしています。QTラッパーを使用して3Dテクスチャを正しくアップロードする

これは(テストを含む)私のコードです:

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; 

最初に(コメント)プリントはすべての値が255(ダミーテスト)されて、私が期待したものを私に示しています。しかし、私のキューブはすべて黒で画面に表示されています。

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" 
                   "};"); 

ノー成功を収めて、問題をそれを理解しようとしている:第二の印刷は

0から255までの範囲、予期しない値を示し、これらは、シェーダです。どんな手がかりもありがたいです。ありがとう。

答えて

0

QOpenGLTextureオブジェクトを作成して塗りつぶしますが、レンダリングの準備ができているユニットにバインドしない限り、OpenGLパイプラインは実際にそのオブジェクトの使用を開始しません。レンダリング可能なオブジェクトに応じて、m_texture->bind()またはm_texture->bind(uint unit)のいずれかとして呼び出す必要があります。

次の行は、空のテクスチャからサイズm_vol_data.total()unsigned charの配列に読み込みを試みるため、ガベージ値を出力します。

glGetTexImage(GL_TEXTURE_3D, 0, GL_RED, GL_UNSIGNED_BYTE, check); 

さらに詳しい説明はhereです。

関連する問題