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