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

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

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);

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос