OpenGL 3D текстуры на кубе
У меня есть простой 3D-куб (все стороны равны по размеру) и 3D-текстуры в OpenGL. Я хочу отобразить 3D текстуру на куб.
Результатом должен быть куб, который раскрашен на всем протяжении так, чтобы каждая точка внутри куба получала цвет от соответствующей точки внутри текстуры. Это по крайней мере моя интерпретация 3D-текстуры.
Как это сделать? Я полагаю, что не получится создать куб с GL_QUADS (6 квадратов) и указать одну текстурную координату для каждой из шести сторон?
Я предполагаю, что мне нужно сделать куб, и при создании куба, указав glTexCoord правильным образом.
1 ответ
То, что вы описываете, звучит как рендеринг вокселей, обычно это делается с помощью трассировки лучей.
3D текстуры, к сожалению, не делают то, что вы описываете. Хотя 3D-текстура использует U,V,W для каждой выборки текселей, OpenGL по-прежнему рисует вдоль плоских поверхностей примитивов. Вам нужно будет написать код трассировки лучей в вашем фрагментном шейдере, чтобы привести его в 3D-текстуру. Поскольку вы будете эффективно использовать трассировку лучей, вы могли бы просто разместить плоский (не повернутый) одиночный квад (еще лучше, чтобы два треугольника составляли псевдо-квад, поскольку квады устарели) и написать фрагментный шейдерный код с вашими средствами трассировки лучей.,
Для получения более подробной информации посмотрите "прямой объем рендеринга".
Вы должны нарисовать много параллельных четырехугольников вместо того, чтобы рисовать один Куд.
Например, нарисуйте серию четырехугольников вдоль оси z:
#define MAP_3DTEXT( TexIndex ) \
glTexCoord3f(0.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f); \
glVertex3f(-dViewPortSize,-dViewPortSize,TexIndex);\
glTexCoord3f(1.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f); \
glVertex3f(dViewPortSize,-dViewPortSize,TexIndex);\
glTexCoord3f(1.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f); \
glVertex3f(dViewPortSize,dViewPortSize,TexIndex);\
glTexCoord3f(0.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f); \
glVertex3f(-dViewPortSize,dViewPortSize,TexIndex);
for ( float fIndx = -1.0f; fIndx <= 1.0f; fIndx+=0.003f )
{
glBegin(GL_QUADS);
MAP_3DTEXT( fIndx );
glEnd();
}
Теперь вы получите то, что хотите. Более подробную информацию можно найти здесь
Вышеупомянутый метод - это так называемый текстурный рендеринг объема. Но если вы ищете лучшие визуальные эффекты и производительность, Ray-Casting будет более подходящим и позволит вам пройти объем.