質問

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

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

その後、glPixelTransferを使用してスケールとバイアスを設定しようとしました。これは、最初のパスで何らかの効果があると思われます(必ずしも望ましいとは限りません)が、上限と下限の制約を変更すると、効果は表示されませんでした。

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

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


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

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

役に立ちましたか?

解決

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

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

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

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

編集:うーん。 Intel 945Gには ARB_fragment_shader はありませんが、 ARB_fragment_program はありますが、これもトリックを実行します。

あなたのfragment-codeはこのように見えるはずです(しかし、私が何かを書いてからしばらく経っているため、おそらくバグがあります)

!!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);

他のヒント

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

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

最新のOGL 2.xの場合、これはGLSLがまさに対象とする種類のプログラムです。素晴らしいドキュメントはここにあります:

OpenGLドキュメント

OpenGLシェーディングランゲージ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top