4

(0,1) にマッピングされ、値 (0, 255) を与える 255 を掛けた R (実数) の浮動小数点値から GLubyte で 2D テクスチャを埋めています。テクスチャから値を 1 つだけ必要とするため、保存は GL_R8 と同じです。これは、たとえば数学関数を表すことができます。

カラーマップ/カラーバーとして機能する 1D テクスチャもアップロードします。次に、2D テクスチャの値に基づいて 1D テクスチャからサンプリングします。

これが私のフラグメントシェーダーの仕組みです:

#version 400
in vec2 f_textureCoord;

layout(location = 0) out vec4 FragColor;

uniform sampler2D textureData;
uniform sampler1D colorBar;


void main() {
    /* Values in the sampler are on (0, 1) * 255 => (0, 255) */
    vec3 texColor = texture2D(textureData, f_textureCoord).rgb;
    float s = texColor.r;

    /* Use the texture value as a coordinate in the 1D colorbar texture */
    vec3 color = texture1D(colorBar, s).rgb;

    float val = color.r;
    FragColor = vec4(val, val, val, 1);
}

これを使用すると、次のエラーが発生します。

glValidateProgram: 検証エラー: 異なるタイプのサンプラーが同じテクスチャ ユニットを指しています

ただし、私のコードは期待どおりに動作し、少なくともレンダリング結果は!

私の質問は次のとおりです。

1) このエラー/警告が表示されるのはなぜですか? ---コメントで回答...

2)これは私がやろうとしていることに対する正しいアプローチですか?関数値を 2D テクスチャに保存する代わりに、別の形式のバッファを使用する必要がありますか?

3) 数学関数 (2D テクスチャの塗りつぶし) がテクスチャ サイズの制限を超えると、問題が発生すると思います。これを回避する方法についての推奨事項はありますか?

4

2 に答える 2

2

1.) glDraw* コマンドの前に glValidateProgram を呼び出して、ユニフォームと属性の場所が正しく設定されているかどうかを確認します。プログラムのリンク後、両方のサンプラ テクスチャ ユニットがゼロのままであるため、誤った警告が発行されます。

2.) カラー インデックスを使用して関数の結果を表示する場合は、問題ありません。私が理解していれば、 textureData にはグレーの値しか含まれていません。テクスチャから 1 つのカラー コンポーネントのみが必要な場合は、次のように記述します。

float s = texture2D(textureData, f_textureCoord).r;

3.) 単一のテクスチャに入れることができるよりも多くのデータを表示する必要がある場合は、タイリングを使用する必要があります (つまり、データをいくつかのテクスチャに分割し、いくつかの描画を行います)。

于 2012-11-15T21:21:22.313 に答える
0

glValidateProgramプログラムを使用して現在のOpenGL状態でレンダリングできるかどうかを検出するためのものです。これには、テクスチャの現在のバインディング、均一なバッファ、およびテクスチャが直接アクセスするその他のものが含まれます(描画バッファと頂点属性はこのリストの一部ではありません)。

于 2012-11-15T21:14:23.697 に答える