Я нахожусь в процессе реализации алгоритма движущихся кубов с использованием геометрического шейдера с C ++ / OpenGL4.
Я генерирую трехмерный перлин-шум и загружаю его в графический процессор в виде серой 3D-текстуры.Затем я создаю трехмерную решетку точек и загружаю их в графический процессор.Кажется, все работает (я могу визуализировать решетку точек как точки, и для забавы я отрисовал простой движущийся куб с текстурой шума).
Затем я начинаю кодировать геометрический шейдер.Я использую функцию texture()
для выборки функции шума Перлина в углах марширующего куба, а затем генерирую требуемые треугольники на основе байта регистра.Однако ничего не появляется.
Я провел некоторый эксперимент и, по-видимому, испускаю любую вершину, координаты которой зависят от значений, полученных с помощью texture()
, портит всю мою геометрию:
#version 430 core
layout(points) in;
layout(triangle_strip, max_vertices = 16) out;
layout(binding = 0) uniform sampler3D densityMap;
layout(binding = 11) uniform isampler2D vertexTable;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
out vec3 wsPos;
void main()
{
// Sample density at cube corners
const vec3 origin = gl_in[0].gl_Position.xyz;
float samplingStep = 0.25f;
const vec3 corners[] = vec3[](
origin + vec3(0.f) * samplingStep,
origin + vec3(0.f, 1.f, 0.f) * samplingStep,
origin + vec3(1.f, 1.f, 0.f) * samplingStep,
origin + vec3(1.f, 0.f, 0.f) * samplingStep,
origin + vec3(0.f, 0.f, 1.f) * samplingStep,
origin + vec3(0.f, 1.f, 1.f) * samplingStep,
origin + vec3(1.f) * samplingStep,
origin + vec3(1.f, 0.f, 1.f) * samplingStep
);
wsPos = corners[1];
gl_Position = viewMatrix * vec4(wsPos, 1.f);
EmitVertex();
wsPos = corners[0];
gl_Position = viewMatrix * vec4(wsPos, 1.f);
EmitVertex();
wsPos = corners[2];
gl_Position = viewMatrix * vec4(wsPos, 1.f);
EmitVertex();
/* wsPos = corner[3] + texture(densityMap, vec3(0.f)).xyz;
gl_Position = viewMatrix * vec4(wsPos, 1.f);
EmitVertex(); */ // <- This messes up everything
EndPrimitive();
return;
}
Например, яобновлять матрицу модели каждый кадр (по существу, перемещая решетку при вводе пользователем), но если я раскомментирую 4-ю вершину или использую вывод texture()
в испущенной вершине, он вообще не перемещается.
В этот момент яя не уверен, как его отладить, любая помощь?
Для полноты вот мои вершинные и фрагментные шейдеры:
.vert
:
#version 430 core
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
layout(location = 0) in vec4 vPos;
void main()
{
gl_Position = modelMatrix * vPos;
}
.frag
:
#version 430 core
layout(binding = 0) uniform sampler3D densityMap;
in vec3 wsPos;
out vec4 fColor;
void main()
{
fColor = vec4(1.f);
}