レイ キャスティング アルゴリズムを使用してボリューム レンダリングを学習しています。ここで良いデモとチュートリアルを見つけました。しかし問題は、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_buffer
1 つの 3D に対して 1 つvolume texture
)にバインドしますが、ユニットはボリューム テクスチャに対してglMultiTexCoord3f(GL_TEXTURE1, x, y, z);
だと思いますが、どちら (テクスチャ ユニット) が? 私が知る限り、シェーダーでテクスチャ obj をバインドするには、バインドするテクスチャ ユニットを取得する必要があります。GL_TEXTURE1
backface_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