我正在使用光线投射算法学习体积渲染。我在这里找到了一个很好的演示和教程。但问题是我有一个 ATI 显卡而不是 nVidia,这使我无法在演示中使用 cg 着色器,所以我想将 cg 着色器更改为 glsl 着色器。看过OpenGL的红皮书(7版),但是对glsl和cg不熟悉。有人可以帮我将演示中的 cg 着色器更改为 glsl 吗?或者是否有任何材料可以使用光线投射(当然在 glsl 中)进行最简单的体积渲染演示。 这是演示的cg着色器。它可以在我朋友的 nVidia 显卡上运行。最让我困惑的是,我不知道如何将 cg 的入口部分翻译成 glsl,例如:
struct vertex_fragment
{
float4 Position : POSITION; // For the rasterizer
float4 TexCoord : TEXCOORD0;
float4 Color : TEXCOORD1;
float4 Pos : TEXCOORD2;
};
更重要的是,我可以编写一个程序将具有 2 个纹理单元的 2 个纹理对象绑定到着色器,前提是我在绘制屏幕时分配了两个 texcoord,例如
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
在演示中,程序将绑定到两个纹理(一个 2D 对应backface_buffer
一个 3D volume texture
),但只有一个纹理单元,glMultiTexCoord3f(GL_TEXTURE1, x, y, z);
我认为该GL_TEXTURE1
单元用于体积纹理,但哪一个(纹理单元)用于backface_buffer
?据我所知,为了在着色器中绑定纹理 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);
该程序编译良好并且链接正常。但我只得到了所有三个位置(texloc、volume_texloc 和stepsizeloc)中的-1。我知道它可能会被优化。任何人都可以帮我将 cg 着色器转换为 glsl 着色器吗?
编辑:如果您对使用 glsl 的现代 OpenGL API 实现(C++ 源代码)感兴趣:Volume_Rendering_Using_GLSL