我正在学习使用光线投射算法进行体积渲染。我在这里找到了一个很好的演示和教程。但问题是,我有一张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;
};
此外,我可以编写一个程序,将两个纹理对象绑定到两个纹理单元以提供着色器,只要在绘制屏幕时分配两个纹理坐标,例如:
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
在演示中,该程序将绑定两个纹理(一个用于backface_buffer的2D纹理,一个用于volume texture的3D纹理),但是使用只有一个纹理单元的glMultiTexCoord3f(GL_TEXTURE1, x, y, z)命令时,我认为GL_TEXTURE1是用于volume texture的,但是哪一个(纹理单元)用于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);
程序编译和链接都没有问题,但我得到的所有三个位置(texloc、volume_texloc和stepsizeloc)都是-1。我知道它可能被优化掉了。有人能帮我将cg着色器翻译成glsl着色器吗?编辑:如果您对使用glsl实现现代OpenGL API(C ++源代码)感兴趣,请查看Volume_Rendering_Using_GLSL