2

画像データに影響を与えずに操作したいテクスチャを表示しています。テクセル値をクランプして、下限値を下回るものはすべて 0 になり、上限値を超えるものはすべて 0 になり、中間値は 0 から 1 に線形にマッピングされるようにしたいと考えています。

もともと、画像を表示するために glDrawPixels を使用していました。上記の問題を解決するには、glPixelMap を使用してカラー マップを作成します。これは見事に機能しました。ただし、パフォーマンス上の理由から、テクスチャを使用して画像を表示し始めました。glPixelMap アプローチはもはや機能していないようです。そのアプローチはうまくいくかもしれませんが、私はそれを機能させることができませんでした。

次に、glPixelTransfer を使用してスケールとバイアスを設定してみました。これは、最初のパスで何らかの効果 (必ずしも望ましいとは限りません) を持っているように見えましたが、上限と下限の制約が変更されたとき、効果は見られませんでした。

その後、フラグメントシェーダーが機能すると言われました。しかし、glGetString(GL_EXTENSIONS) を呼び出した後、GL_ARB_fragment_shader がサポートされていないことがわかりました。さらに、glCreateShaderObjectARB を呼び出すと、nullreferenceexception が発生します。

だから今、私は途方に暮れています。私は何をすべきか?助けてください。


うまくいく可能性があるものは何でも試してみたいと思っています。ベンダーは Intel で、レンダラーは Intel 945G です。残念ながら、私はマザーボードに統合されたグラフィックス カードに限定されており、gl 1.4 しかありません。

これまでのご回答ありがとうございます。

4

3 に答える 3

2

かなり古いグラフィック カードを使用していない限り、フラグメント シェーダーがサポートされていないのは驚くべきことです。これを使用して再確認することをお勧めします。

また、最大値を超えるものを 0 にしたいですか? おそらくあなたは1を意味しましたか?0 ではなく 1 を意味する場合は、求めていることを実行するための非常に長い方法です。

要約した答えは、複数のレンダリング パスを使用することです。まず、イメージを通常の強度でレンダリングします。次に、減算ブレンディング (glBlendEquation を参照) を使用して、最小値を減算します。次に、加算ブレンディングを使用して、すべてを 1/(max-min) で乗算します (複数のパスが必要になる場合があります)。

本当にこれをやりたい場合は、グラフィックカードのGL_VENDORとをポストバックしてください。GL_RENDERER

編集:うーん。Intel 945G には がありませんがARB_fragment_shader、これARB_fragment_programも機能します。

フラグメントコードは次のようになります (ただし、私が何かを書いてからしばらく経っているので、おそらくバグがあります)

!!ARBfp1.0
ATTRIB tex = fragment.texcoord[0]
PARAM cbias = program.local[0]
PARAM cscale = program.local[1]
OUTPUT cout = result.color

TEMP tmp
TXP tmp, tex, texture[0], 2D
SUB tmp, tmp, cbias
MUL cout, tmp, cscale

END 

これを次のように OpenGL にロードします。

GLuint prog;
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glGenProgramsARB(1, &prog);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);

次に、ジオメトリをレンダリングする前に、次のことを行います。

glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
colour4f cbias = cmin;
colour4f cscale = 1.0f / (cmax-cmin);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a);

//Draw your textured geometry

glDisable(GL_FRAGMENT_PROGRAM_ARB);
于 2008-10-24T22:49:56.343 に答える
0

GL_ARB_fragment_program拡張機能がサポートされているかどうかも確認してください。この拡張機能は、ASM スタイルのフラグメント プログラムをサポートしています。これは、OpenGL 1.4 でサポートされるはずです。

于 2008-10-24T23:44:19.370 に答える
-1

このような古いバージョンの OpenGL を使用しているのは本当に残念です。カードでアップグレードできますか?

より最近の OGL 2.x では、これはまさに GLSL が対象とする種類のプログラムです。優れたドキュメントは次の場所にあります。

OpenGL ドキュメント

OpenGL シェーディング言語

于 2008-10-25T23:03:10.673 に答える