2017-07-21 7 views
1

QT QML 3DでC++でアプリケーションを開発しています。私はフラグメントシェーダに何十もの浮動小数点値(または浮動小数点数のベクトル)を渡す必要があります。これらの値はライトの位置と色ですので、0.0〜1.0の範囲の値より多く必要です。しかし、QMLの浮動小数点数または整数の配列をシェーダに渡すサポートはありません。私の考えは、フロートをテクスチャに保存し、テクスチャをシェーダに渡し、そこから値を取得することです。float値のテクスチャをシェーダに渡します

私はこのような何か試してみました:

float array [4] = {100.5, 60.05, 63.013, 0.0}; 
uchar data [sizeof array * sizeof(float)]; 
memcpy(data, &array, sizeof array * sizeof(float)); 
QImage img(data, 4, 1, QImage::Format_ARGB32); 

をしてsampler2DとしてフラグメントシェーダにこのQImageのを渡します。しかし、GLSLのテクスチャから値を取得するmemcpyのようなメソッドがありますか? texelFetchメソッドは、浮動小数点数の範囲が0.0〜1.0のvec4のみを返します。シェーダのテクスチャから元の値を取得するにはどうすればよいですか? 私はsampler2D型を使用する方が好きですが、GLSLにダイレクトメモリアクセスをサポートする他の型がありますか?

+0

[フロートの配列から新しいQImageを作成する方法](https://stackoverflow.com/questions/3379268/how-to-create-a-new-qimage-from-an-array- of-floats?rq = 1) – Rabbid76

+0

これは私の問題を解決しません。私は正しい浮動小数点値でQImageを作成するための問題はありません。シェーダ(GLSL)でこれらの値にアクセスするのに問題があります。 – david

答えて

2

テクスチャアクセス機能doテクスチャから直接読み込みます。問題は、Format_ARGB32がチャネルあたり32ビットのでないことです。;ピクセルあたり32ビットのです。 this documentation pageから、QImage浮動小数点イメージを作成できないことが明らかです。正規化された形式のみを扱います。 QImageは、OpenGLイメージをロードするのではなく、GUIの問題を扱うためのクラスであるようです。

あなたはQtイメージのショートカットを捨てて、実際にOpenGLを直接使用する必要があります。

+0

上記のようなQImageを作成すると、値はそこに保存されますが、ピクセルごとには整理されません。ですから、ピクセルやテクセルごとにテクスチャにアクセスしないGLSLのmemcpyのような関数が必要ですが、バイトを任意の配列にコピーするだけです。このような機能がありますか? – david

+2

@ david:*はピクセルごとに構成されています。 Qtは、32ビット/チャンネルの浮動小数点数ではなく、8ビット/チャンネルの正規化整数としてこれらのピクセルを解釈しています。 OpenGLはあなたが必要とするものを正確に行うことができます。ちょうど*正しく*使用してください。 –

1

これは、浮動小数点配列から浮動小数点数のテクスチャを作成します。

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, height, 0, GL_RED, GL_FLOAT, &array); 

あなたはこのようなあなたのフラグメントシェーダからfloat値にアクセスすることができます。

uniform sampler2D float_texture; 

... 

float float_texel = float(texture2D(float_texture, tex_coords.xy)); 

"OpenGLのフロートテクスチャを" 十分に文書化の対象です。 What exactly is a floating point texture?

+0

こんにちは、フラグメントシェーダ*の値にアクセスする方法をあなたの答えを広げてください。私には、これは私の問題に適用される可能性がありますここに記載:https://stackoverflow.com/questions/45301962/passing-qml-array-to-shadereffect – derM

+0

私はglTexImage2D(GL_TEXTURE_2D、0、GL_R32F、幅、高さ、0、GL_RED、GL_FLOAT、&array);作成したテクスチャをシェーダに渡す必要があります:GLuint texture_sampler_loc = glGetUniformLocation(shaderprogram、 "texture"); glUniform1f(texture_sampler_loc、1);しかしQMLでは、シェーダプログラムへのポインタを取得できません。シェーダにテクスチャを渡す方法は他にありますか? – david

関連する問題