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