Uczę się renderowania objętości za pomocą algorytmu odlewania promieni. Znalazłem dobre demo i tuturial w here. ale problem polega na tym, że mam kartę graficzną ATI zamiast nVidii, co uniemożliwia mi używanie shadera cg w demie, więc chcę zmienić shadera cg na shader glsl. Przeszedłem przez czerwoną książkę (7 edycji) OpenGL, ale nie znałem glsl i cg. czy ktoś może mi pomóc zmienić shader cg w wersji demonstracyjnej na glsl? lub czy istnieją materiały do najprostszej wersji renderowania wolumenu za pomocą ray castingu (oczywiście w języku glsl). here jest shaderem cg demonstracji. i może działać na karcie graficznej nVidii mojego przyjaciela. co najbardziej mnie mylące jest to, że nie wiem jak przetłumaczyć część wejścia cg do GLSL, na przykład:renderowanie objętości (przy użyciu glsl) z algorytmem odlewania promieni
struct vertex_fragment
{
float4 Position : POSITION; // For the rasterizer
float4 TexCoord : TEXCOORD0;
float4 Color : TEXCOORD1;
float4 Pos : TEXCOORD2;
};
co więcej mogę napisać program BIND 2 tekstury obiekt z jednostką 2 teksturę shader pod warunkiem, że przypisanie dwóch texcoord podczas rysowania na ekranie, na przykład
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
W demo program będzie wiązać się z dwóch tekstury (jeden 2D dla backface_buffer
jeden 3D dla volume texture
), ale z tylko jedną jednostką teksturową, taką jak glMultiTexCoord3f(GL_TEXTURE1, x, y, z);
, myślę, że jednostka GL_TEXTURE1
jest dla tekstury objętości, ale która z nich (jednostka Texure) jest dla backface_buffer
? o ile wiem, w celu związania tekstury OBJ w cieniującego, muszę dostać jednostkę tekstury wiązać na przykład:
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);
program jest kompilowany w porządku i połączone ok. ale mam tylko -1 ze wszystkich trzech lokalizacji (texloc, volume_texloc i stepsizeloc). Wiem, że to może być zoptymalizowane. ktoś może mi pomóc przetłumaczyć shadera cg na shader glsl?
Edit: Jeśli zainteresowanie w nowoczesny implementacji OpenGL API (C++ kod źródłowy) z GLSL: Volume_Rendering_Using_GLSL
Cg shadery działają równie dobrze na ATi/AMD, jak na NVidii (co jest dość względne, ponieważ środowisko wykonawcze Cg ma * wiele błędów * dotyczących błędów w kodekach). – ssube
Przypomnienie: kompilator Cg może emitować kod GLSL. Z kartami AMD/ATI można również używać Cg. Tylko kilka rzeczy specyficznych dla NVidii nie zadziała, a wydajność będzie nieznacznie ograniczona. – datenwolf
@ datenwolf naprawdę? Spróbuję. Zastanawiam się, jak wyemitować kod GLSL? – toolchainX