объемный рендеринг (с использованием glsl) с алгоритмом преобразования лучей

Я изучаю объемный рендеринг с использованием алгоритма преобразования лучей. Я нашел хорошую демонстрацию и учебное пособие в здесь . но проблема в том, что у меня графическая карта ATI вместо nVidia, из-за чего я не могу использовать шейдер cg в демонстрации, поэтому я хочу изменить шейдер cg на шейдер glsl. Я просмотрел красную книгу (7-е издание) OpenGL, но не знаком с glsl и cg. Кто-нибудь может помочь мне изменить шейдер cg в демонстрации на glsl? или есть какие-нибудь материалы к простейшей демонстрации объемного рендеринга с использованием ray casting (конечно, в 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 для объемной текстуры ), но только с одним блоком текстуры, например glMultiTexCoord3f (GL_TEXTURE1, x, y, z); Я думаю, что 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);

программа скомпилирована нормально и связана нормально. но я получил только -1 из всех трех местоположений (texloc, volume_texloc и stepsizeloc). Я знаю, что его можно оптимизировать. Кто-нибудь может помочь мне перевести шейдер cg в шейдер glsl?

Изменить: Если вас интересует современная реализация OpenGL API (исходный код C ++) с glsl: Volume_Rendering_Using_GLSL

18
задан toolchainX 22 March 2013 в 05:08
поделиться