renderização de volume (usando glsl) com algoritmo de conversão de raios
Estou aprendendo a renderização de volume usando o algoritmo de conversão de raios. Encontrei uma boa demonstração e orientação emaqu. mas o problema é que eu tenho uma placa gráfica ATI em vez da nVidia, o que me impede de usar o cg shader na demonstração, por isso quero mudar o cg shader para glsl shader. Passei pelo livro vermelho (edição 7) do OpenGL, mas não estou familiarizado com glsl e cg. alguém pode me ajudar a mudar o cg shader na demo para glsl? ou existe algum material para a demonstração mais simples da renderização de volume usando a projeção de raios (é claro no glsl).aqu é o sombreador cg da demonstração. e pode funcionar na placa gráfica nVidia do meu amigo. o que mais me confunde é que não sei traduzir a parte de entrada do cg para o glsl, por exemplo:
struct vertex_fragment
{
float4 Position : POSITION; // For the rasterizer
float4 TexCoord : TEXCOORD0;
float4 Color : TEXCOORD1;
float4 Pos : TEXCOORD2;
};
além do mais, eu posso escrever um programa vincular 2 objetos de textura com 2 unidades de textura ao shader, desde que atribua dois texcoord ao desenhar a tela, por exemplo
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
Na demonstração, o programa será vinculado a duas texturas (uma 2D parabackface_buffer
um 3D paravolume texture
), mas com apenas uma unidade de textura comoglMultiTexCoord3f(GL_TEXTURE1, x, y, z);
Eu acho que oGL_TEXTURE1
é para a textura do volume, mas qual (unidade de textura) é para obackface_buffer
? Até onde eu sei, para vincular obj de textura em um shader, preciso obter uma unidade de textura para vincular, por exemplo:
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);
programa é compilado corretamente e está ok. mas só obtive -1 de todos os três locais (texloc, volume_texloc e stepsizeloc). Eu sei que pode ser otimizado. alguém pode me ajudar a traduzir o cg shader para glsl shader?
Editar Se você tem interesse na implementação moderna da API OpenGL (código fonte C ++) com glsl: Volume_Rendering_Using_GLSL