Странная проблема с текстурой и геометрией шейдера в OpenGL - PullRequest
0 голосов
/ 27 февраля 2019

Я нахожусь в процессе реализации алгоритма движущихся кубов с использованием геометрического шейдера с 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);
}
...