レイキャスティングアルゴリズムを使用してボリュームレンダリングを学習しています。私は良いデモと修道院を発見したhere。問題は、デモでcgシェーダを使用できないようにするnVidiaの代わりにATIグラフィックカードを使用しているため、CGシェーダをglslシェーダに変更したいということです。私はOpenGLの赤い本(7版)を見てきましたが、glslとcgに精通していません。 誰でも私がデモのCGシェーダをglslに変更するのを助けることができますか?レイキャスティングを使ったボリュームレンダリングの最も簡単なデモの資料があります(もちろんglslで)。 hereは、デモのcgシェーダです。それは私の友人のnVidiaグラフィックカードで動作することができます。レイキャスティングアルゴリズムでボリュームレンダリング(glslを使用)
struct vertex_fragment
{
float4 Position : POSITION; // For the rasterizer
float4 TexCoord : TEXCOORD0;
float4 Color : TEXCOORD1;
float4 Pos : TEXCOORD2;
};
より何、私は2テクスチャユニットとプログラムのバインド2テクスチャオブジェクトを書くことができます:どのようなほとんどは私を混乱することは、私は例えば、GLSLにCGのエントリー一部を翻訳する方法がわからないということですシェーダは、画面を描画する際にデモでは、プログラムは、ために2つのテクスチャ(1つの2Dに結合する
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
Iは、例えば、2 TEXCOORDを割り当てることを提供しました私はGL_TEXTURE1
ユニットはボリュームテクスチャ用ですが、どのテクスチャユニットがbackface_buffer
用であると思いますか?volume texture
の場合は3210 1 3Dですが、glMultiTexCoord3f(GL_TEXTURE1, x, y, z);
のようなテクスチャユニットは1つだけです。私の知る限り、シェーダでテクスチャOBJをバインドするために知っているように、私は、例えばバインドするテクスチャユニットを取得する必要があります。
glLinkProgram(p);
texloc = glGetUniformLocation(p, "tex");
volume_texloc = glGetUniformLocation(p, "volume_tex");
stepsizeloc = glGetUniformLocation(p, "stepsize");
glUseProgram(p);
glUniform1i(texloc, 0);
glUniform1i(volume_texloc, 1);
glUniform1f(stepsizeloc, stepsize);
//When rendering an object with this program.
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, backface_buffer);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_3D, volume_texture);
プログラムは罰金コンパイルし、[OK]をリンクされています。 3つの場所(texloc、volume_texloc、stepsizeloc)のうち-1つしかありません。私はそれが最適化されるかもしれないことを知っている。 誰でも私がcgシェーダをglslシェーダに変換するのを助けることができますか?
編集:あなたはGLSLを備えたモダンなOpenGLのAPIの実装(C++ソースコード)に興味ある場合は、次の解決Volume_Rendering_Using_GLSL
Cgシェーダは、nVidiaと同じようにATi/AMDでも同様に動作します(Cgランタイムは*多くの*クラッシュ・オン・エラーコードパスを持っているため、比較的相対的です)。 – ssube
CgコンパイラはGLSLコードを発行することができます。また、CgはAMD/ATIカードで使用できます。わずかなNVidia特有のものはうまく動作せず、パフォーマンスはわずかに低下します。 – datenwolf
@datenwolf本当ですか?私はそれを試してみましょう。私はどのようにglslコードを発行するのだろうか? – toolchainX