19

レイ キャスティング アルゴリズムを使用してボリューム レンダリングを学習しています。ここで良いデモとチュートリアルを見つけました。しかし問題は、nVidia ではなく ATI グラフィック カードを使用しているため、デモで cg シェーダーを使用できないため、cg シェーダーを glsl シェーダーに変更したいと考えています。私は OpenGL のレッド ブック (第 7 版) を読みましたが、glsl と cg には詳しくありません。デモの cg シェーダを glsl に変更するのを手伝ってくれる人はいますか? または、レイキャスティングを使用したボリュームレンダリングの最も単純なデモの材料はありますか(もちろんgslで)。 これがデモの cg シェーダです。友人の nVidia グラフィック カードでも動作します。私を最も混乱させているのは、cg のエントリ部分を glsl に変換する方法がわからないことです。たとえば、次のようになります。

struct vertex_fragment
 {
   float4 Position    : POSITION; // For the rasterizer
   float4 TexCoord    : TEXCOORD0; 
   float4 Color       : TEXCOORD1;
   float4 Pos         : TEXCOORD2;
 };

さらに、たとえば、画面を描画するときに 2 つの texcoord を割り当てれば、シェーダーに 2 つのテクスチャー ユニットを持つ 2 つのテクスチャー オブジェクトをバインドするプログラムを記述できます。

glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);

glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);

デモでは、プログラムは 2 つのテクスチャ (1 つの 3D に対して 1 つの 2D に対して 1 つの 2D に対してbackface_buffer1 つの 3D に対して 1 つvolume texture)にバインドしますが、ユニットはボリューム テクスチャに対してglMultiTexCoord3f(GL_TEXTURE1, x, y, z);だと思いますが、どちら (テクスチャ ユニット) が? 私が知る限り、シェーダーでテクスチャ obj をバインドするには、バインドするテクスチャ ユニットを取得する必要があります。GL_TEXTURE1backface_buffer

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

プログラムは正常にコンパイルされ、正常にリンクされています。しかし、3 つの場所 (texloc、volume_texloc、stepsizeloc) のうち -1 しか取得できませんでした。最適化されている可能性があることはわかっています。cg シェーダーを glsl シェーダーに変換するのを手伝ってくれる人はいますか?

編集: glslを使用した最新の OpenGL API 実装 (C++ ソース コード) に興味がある場合: Volume_Rendering_Using_GLSL

4

1 に答える 1