этот код работает только для сеток, центрированных вокруг (0,0,0)
, если это не так или даже если (0,0,0)
не находится внутри сетки, тогда возникают артефакты ...
Я бы начал с вычисления BBOX BBOXmin(x0,y0,z0),BBOXmax(x1,y1,z1)
вашей сетки и перевел бы положение, используемое для координаты текстуры, таким образом, чтобы оно центрировалось вокруг нее:
center = 0.5*(BBOXmin+BBOXmax);
texCoord = vec3(a_position-center);
Однако неравномерная плотность вершин все равно может привести к артефактам масштабирования текстуры, особенно если размеры сторон BBOX слишком сильно отличаются. Изменение масштаба на куб поможет:
vec3 center = 0.5*(BBOXmin+BBOXmax); // center of BBOX
vec3 size = BBOXmax-BBOXmin; // size of BBOX
vec3 r = a_position-center; // position centered around center of BBOX
r.x/=size.x; // rescale it to cube BBOX
r.y/=size.y;
r.z/=size.z;
texCoord = r;
Опять же, если центр BBOX находится не внутри сетки, это не сработает ...
Часть отражения не ясна для меня, у вас есть несколько изображений / скриншотов?
[Edit1] простой пример
Я вижу это так (без упомянутых выше корректировок смещения центра и соотношения сторон):
[Vertex]
//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
uniform mat4x4 tm_l2g;
uniform mat4x4 tm_g2s;
layout(location=0) in vec3 pos;
layout(location=1) in vec4 col;
out smooth vec4 pixel_col;
out smooth vec3 pixel_txr;
//------------------------------------------------------------------
void main(void)
{
pixel_col=col;
pixel_txr=(tm_l2g*vec4(pos,0.0)).xyz;
gl_Position=tm_g2s*tm_l2g*vec4(pos,1.0);
}
//------------------------------------------------------------------
[Фрагмент]
//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
in smooth vec4 pixel_col;
in smooth vec3 pixel_txr;
uniform samplerCube txr_skybox;
out layout(location=0) vec4 frag_col;
//------------------------------------------------------------------
void main(void)
{
frag_col=texture(txr_skybox,pixel_txr);
}
//------------------------------------------------------------------
А вот превью:
Белый тор в первых нескольких кадрах использует фиксированную функцию, а остальные используют шейдеры. Как вы можете видеть, единственный вход, который я использую - это вершина position,color
и матрицы преобразования tm_l2g
, которые преобразуются из координат сетки в глобальный мир, и tm_g2s
, который содержит перспективную проекцию ...
Как вы можете видеть, я визуализирую BBOX с той же текстурой CUBE MAP, которую я использую для рендеринга модели, чтобы она выглядела как крутой эффект отражения / прозрачности :) (который не был намеренным).
В любом случае, когда я меняю линию
pixel_txr=(tm_l2g*vec4(pos,0.0)).xyz;
в
pixel_txr=pos;
В моем вершинном шейдере объект снова будет твердым:
Вы можете объединить оба, передав два вектора координат текстуры и выбрав два фрагмента во фрагменте, добавив их с некоторым соотношением вместе. Конечно, вам нужно будет передать 2 текстуры карты куба, одну для объекта и одну для скайбокса ...
Красные предупреждения исходят из моего кода на стороне процессора, напоминая мне, что я пытаюсь установить униформу, которой нет в шейдерах (как я делал это из примера bump mapping без изменения кода на стороне процессора. ..)
[Edit1] здесь предварительный просмотр вашей сетки со смещением
Vertex немного изменяется (только что добавлено смещение, описанное в ответе):
//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
uniform mat4x4 tm_l2g;
uniform mat4x4 tm_g2s;
uniform vec3 center=vec3(0.0,0.0,2.0);
layout(location=0) in vec3 pos;
layout(location=1) in vec4 col;
out smooth vec4 pixel_col;
out smooth vec3 pixel_txr;
//------------------------------------------------------------------
void main(void)
{
pixel_col=col;
pixel_txr=pos-center;
gl_Position=tm_g2s*tm_l2g*vec4(pos,1.0);
}
//------------------------------------------------------------------
Таким образом, смещая центральную точку, вы можете избавиться от искажения сингулярной точки, однако, как я упоминал в комментариях для произвольных сеток, всегда будут некоторые искажения с дешевыми текстурными приемами вместо правильных текстурных координат.
Остерегайтесь, мой размер был изменен / нормализован (к сожалению, я не помню, если его диапазон <-1,+1>
или другой ona и слишком ленив, чтобы копаться в моем исходном коде движка GLSL, в котором я проверял это), чтобы смещение могло иметь различную величину в вашей среде, чтобы достичь того же результата.