Текстурные артефакты и билинейная фильтрация с OpenGL glTexture3D

Я работаю над приложением объемного рендеринга, где мне приходится резать плоскости моих объемных данных. Проблема в том, что при ограниченном разрешении я получаю некоторые артефакты на границах белых зон.

Объем представляет собой GLubyte M [глубина] [ширина] [высота], где есть 255с и 0s.
Как вы можете видеть, на границах появляются явные проблемы, когда я поворачиваю свою модель.

У меня уже есть следующие настройки OpenGL:

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glEnable(GL_TEXTURE_3D);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, iWidth, iHeight, iDepth, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, M);
gluBuild3DMipmaps(texName,GL_LUMINANCE,iWidth,iHeight,iDepth, GL_LUMINANCE, GL_UNSIGNED_BYTE, M);

Мне интересно, возможно ли написать билинейный фильтр в GLSL для texture3D с использованием sampler3D, который помогает сгладить зернистые границы или эти раздражающие артефакты.

Есть много примеров билинейной фильтрации для texture2D, но я не могу найти такую ​​для 3D-текстур.

Можно ли адаптировать этот код для 3D-сэмплера?

const float textureSize = 512.0; //size of the texture
const float texelSize = 1.0 / textureSize; //size of one texel
vec4 texture2DBilinear( sampler2D textureSampler, vec2 uv )
{
// in vertex shaders you should use texture2DLod instead of texture2D
vec4 tl = texture2D(textureSampler, uv);
vec4 tr = texture2D(textureSampler, uv + vec2(texelSize, 0));
vec4 bl = texture2D(textureSampler, uv + vec2(0, texelSize));
vec4 br = texture2D(textureSampler, uv + vec2(texelSize , texelSize));
vec2 f = fract( uv.xy * textureSize ); // get the decimal part
vec4 tA = mix( tl, tr, f.x ); // will interpolate the red dot in the image
vec4 tB = mix( bl, br, f.x ); // will interpolate the blue dot in the image
return mix( tA, tB, f.y ); // will interpolate the green dot in the image
}

или можно улучшить интерполяцию без увеличения размера тома (на самом деле это 512x512x512 GLubyte)

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]