4

振幅値を含む浮動アルファ テクスチャがあります。デシベルに変換され、グレースケールで表示されます。

会話コード (C++) は次のとおりです。

const float db_min = -100, db_max = 0;
float image[height][width];
for (int y = 0; y<height; ++y) {
  for (int x = 0; x<width; ++x) {
    image[y][x]= 20.f * log(a[i])/log(10.f);
    image[y][x] = (image[y][x]-db_min)/(db_max-db_min);
  }
}

フラグメント シェーダー (GLSL) は次のとおりです。

#version 120
precision highp float;
varying vec2 texcoord;
uniform sampler2D texture;
void main() {
  float value = texture2D(texture, texcoord).a;
  gl_FragColor = vec4(value, value, value, 0);
}

スクリーンショットは次のとおりです。 ここに画像の説明を入力

完璧に見えます!ここで、C++ ではなく、フラグメント シェーダー自体で会話を書きたいと思います。

#version 120
precision highp float;
varying vec2 texcoord;
uniform sampler2D texture;
const float db_min = -100., db_max = 0.;
void main() {
  float value = texture2D(texture, texcoord).a;
  value = 20. * log(value)/log(10.);
  value = (value-db_min)/(db_max-db_min);
  gl_FragColor = vec4(value, value, value, 0);
}

スクリーンショットは次のとおりです。 ここに画像の説明を入力

結果が異なるのはなぜですか?私は何を間違っていますか?

4

1 に答える 1

2

限られたテクセル精度 - それが問題になる可能性があります。logチャンネルごとの8ビットのテクスチャ(RGBA8など)で(私が理解しているように、非常に高い範囲の)値を保持していると推測できます。次に、浮動小数点形式を使用するか、高精度/範囲の値を 4 バイト形式 (固定小数点など) にパックできます。

于 2013-01-16T14:32:04.240 に答える