相关疑难解决方法(0)

体绘制(使用glsl)和光线投射算法

我正在使用光线投射算法学习体绘制.我在这里找到了一个很好的演示和tuturial .但问题是我有一个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;
 };
Run Code Online (Sandbox Code Playgroud)

更何况,我可以编写一个程序将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); …
Run Code Online (Sandbox Code Playgroud)

opengl glsl demo raycasting volume-rendering

18
推荐指数
1
解决办法
2万
查看次数

标签 统计

demo ×1

glsl ×1

opengl ×1

raycasting ×1

volume-rendering ×1