Я изучаю объемный рендеринг с использованием алгоритма лучевого каста. Я нашел хорошую демонстрацию и tuturial в здесь. но проблема в том, что у меня есть графическая карта 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;
};
что еще, я могу написать программу bind 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);
glBindTexture(GL_TEXTURE_2D, backface_buffer);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_3D, volume_texture);
программа скомпилирована в порядке и привязана к окну. но я получил только -1 из всех трех местоположений (texloc, volume_texloc и stepizeloc). Я знаю, что это может быть оптимизировано. любой может помочь мне перевести cg-шейдер в glsl-шейдер?
Изменить: Если вы заинтересованы в современной реализации OpenGL API (исходный код на С++) с помощью glsl: Volume_Rendering_Using_GLSL