2016-08-07 10 views
0

私はOpenGL 4.4でQt 5.7.0を使用していますが、Qtを使用するために古いコードを移植しようとしています。Qt5 - glTexStorage2D/glBindImageTextureは未定義ですか?

float* data = new float[IMAGE_WIDTH * IMAGE_HEIGHT]; 
    for (int i = 0; i < IMAGE_WIDTH * IMAGE_HEIGHT; ++i) 
     data[i] = 0.f; 

    GLuint tex[1]; 
    glGenTextures(1, tex); 
    glBindTexture(GL_TEXTURE_2D, tex[0]); 
    glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, GL_RED, GL_FLOAT, data); 
    glBindImageTexture(0, tex[0], 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F); 

    delete[] data; 

しかし、明らかglTexStorage2DglBindImageTexture:私は私のGLEW、非Qtのプロジェクトでは正常に動作し、次のコードを使用していますので、私の知る限り理解し、Qtはシェーダーテクスチャを処理する独自の方法を持っていません。は未定義です。私はドキュメンテーションを見て、彼らは存在する必要があります。私は#includeQOpenGLFunctions_4_4_CoreQOpenGLFunctions_4_2_CoreQOpenGLTextureQOpenGLFunctionsにしようとしましたが、問題は解決していません。例外がスローされた「と

QOpenGLFunctions_4_4_Core gl; 
gl.glTexStorage2D((GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT); 

クラッシュ::でも、インスタンスを作成することは私にエラーを与える

inline void QOpenGLFunctions_4_4_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) 
{ 
    d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height); 
} 

:私もQOpenGLFunctions_4_4_Coreのソースに見てきました。アクセス違反を読んthis-> d_4_2_Coreはnullptrました。 "

a)この問題を解決する方法はありますか。またはそれより良いb)イメージのロード/ストアを行うQtの方法?

+0

Qtのラッパーを経由するのではなく、通常のOpenGL呼び出しを使用できない理由はありますか? –

+0

@NicolBolas私は、はるかに整理され扱いやすいQtの方法を見つけました。私はむしろQtの半分ではなく、普通のOpenGLの半分ですべてをやりたいと思います。 – otah007

答えて

0

QOpenGLContext::versionFunctions()QOpenGLFunctions_4_4_Coreオブジェクトへのポインタを取得する必要があります。あなた自身のオブジェクトを作成することができますが、コンテキストが最新になっている間に、initializeOpenGLFunctions()メンバ関数を使用して関数ポインタを手動でロードする必要があります。

+0

答えをいただきありがとうございますが、コンテキストを取得しようとすると、ベースウィンドウクラスの継承元がOpenGL 3.1であることがわかりました。そのため、関数は未定義です。それを4.4に変更するとエラーが解決されました。 – otah007