Прямой объемный рендеринг: артефакты, накладывающиеся на текстурыC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Прямой объемный рендеринг: артефакты, накладывающиеся на текстуры

Сообщение Anonymous »


Я пытаюсь использовать прямой объемный рендеринг в Chai3D, но есть артефакт, который делает края граничной сетки хоста всегда видимыми, даже если перед ним находится другой объект. Есть какие-нибудь подсказки о том, что может быть причиной проблемы?


Изображение


Весь код можно увидеть здесь, приложение запускается независимо от подключенного к нему тактильного устройства:

Пример прямого объемного рендеринга Chai3D

Вот код шейдера:

uniform vec3 uMinCorner; униформа vec3 uMaxCorner; униформа vec3 uTextureScale; униформа vec3 uGradientDelta; единый сэмплер 3D uVolume; единый сэмплер1D uColorLUT; равномерная поплавковая поверхность uIsosurface; равномерное число с плавающей запятой uOpacityThreshold; единообразный float uOpticalDensityFactor; равномерное плавающее uResolution; изменение vec4 vPosition; vec3 dx = vec3(uGradientDelta.x, 0.0, 0.0); vec3 dy = vec3(0.0, uGradientDelta.y, 0.0); vec3 dz = vec3(0.0, 0.0, uGradientDelta.z); запись с плавающей запятой (vec3 e1, vec3 d) { float t = расстояние (uMinCorner, uMaxCorner); vec3 a = (uMinCorner - e1)/d; vec3 b = (uMaxCorner - e1)/d; vec3 u = min(a, b); return max(max(-t, u.x), max(u.y, u.z)); } градиент vec3 (vec3 tc) { век3 набла = век3( текстура3D(uVolume, tc + dx).r - текстура3D(uVolume, tc - dx).r, текстура3D(uVolume, tc + dy).r - текстура3D(uVolume, tc - dy).r, текстура3D(uVolume, tc + dz).r - текстура3D(uVolume, tc - dz).r ); return (набла/uGradientDelta) * uTextureScale; } оттенок vec3(vec3 p, vec3 v, vec3 n) { vec4 lp = gl_ModelViewMatrixInverse * gl_LightSource[0].position; vec3 l = нормализовать(lp.xyz - p * lp.w); vec3 h = нормализовать (l + v); float cos_i = max(точка(n, l), 0.0); float cos_h = max (точка (n, h), 0,0); vec3 Ia = gl_FrontLightProduct[0].ambient.rgb; vec3 Id = gl_FrontLightProduct[0].diffuse.rgb * cos_i; vec3 Is = gl_FrontLightProduct[0].specular.rgb * pow(cos_h, gl_FrontMaterial.shininess); возврат (Ia+Id+Is); } недействительный основной (недействительный) { камера vec4 = gl_ModelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0); vec3 raydir = нормализовать (vPosition.xyz - camera.xyz); float t_entry = запись (vPosition.xyz, raydir); t_entry = max(t_entry, -distance(camera.xyz, vPosition.xyz); float t_step = расстояние (uMinCorner, uMaxCorner) / uResolution; vec3 tc_step = uTextureScale * (t_step * raydir); сумма vec4 = vec4(0,0); vec3 tc = gl_TexCoord[0].stp + t_entry * tc_step / t_step; for (float t = t_entry; t < 0,0; t += t_step, tc += tc_step) { интенсивность плавающего режима = текстура3D(uVolume, tc).r; цвет vec4 = текстура1D (uColorLUT, интенсивность); если (color.a < 0,001) продолжить; vec3 nabla = градиент (tc); позиция vec3 = vPosition.xyz + t * raydir; vec3 нормальный = -нормализовать (набла); vec3 view = -raydir; vec3 затененный = оттенок (положение, вид, нормальный); color.rgb *= затененный; float Tr = exp(-color.a * uOpticalDensityFactor); color.rgb *= 1.0 - Tr; цвет.а = 1,0 – Тр; сумма += (1.0 - сумма.а) * цвет; если (sum.a > uOpacityThreshold) { vec4 clip = gl_ModelViewProjectionMatrix * vec4(position, 1.0); gl_FragDepth = (gl_DepthRange.diff * clip.z / clip.w + gl_DepthRange.near + gl_DepthRange.far) * 0,5; перерыв; } } gl_FragColor = сумма; } Это мой основной графический цикл:

while (!glfwWindowShouldClose(окно)) { // получаем ширину и высоту окна glfwGetWindowSize(окно, &ширина, &высота); // рендеринг графики обновлениеГрафика(); // меняем буферы glfwSwapBuffers (окно); // обрабатываем события glfwPollEvents(); // счетчик частоты сигнала freqCounterGraphics.signal(1); } UpdateGraphics() использует функции Chai3D:
// обновляем карты теней (если есть) world->updateShadowMaps(false, MirroredDisplay); // рендерим мир камера->renderView(ширина, высота); // ждем, пока все команды GL будут выполнены глФиниш();
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Артефакты текстуры при разных значениях масштабирования ортогональной камеры
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Артефакты текстуры при разных значениях масштабирования ортогональной камеры
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Текстура OpenGL показывает сплошной цвет текстуры, а не всей текстуры.
    Anonymous » » в форуме C++
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Почему мое видео не соответствует размеру текстуры, когда я меняю размер текстуры
    Anonymous » » в форуме Android
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Соединяйте узлы с соседями по прямой видимости (прямой)
    Anonymous » » в форуме Python
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»