объемный рендеринг (с использованием 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