Световой проход для Shadow Mapping не работает с тесселяцией?

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

light.vs.glsl

#version 440 core

layout(location = 4) uniform mat4 light_mvp;

layout(location = 0) in vec4 position;

void main(void) {
    gl_Position = light_mvp * position;
}

light.fs.glsl

#version 440 core

layout(location = 0) out vec4 color;

void main(void) {
    color = vec4(gl_FragCoord.z);
}

Однако я пришел к выводу, что на самом деле я делаю тесселяцию, поэтому я не имею понятия, что происходит сейчас, в Terrain.java:

public class Terrain implements Drawable {
    //<editor-fold defaultstate="collapsed" desc="keep-imports">
    static {
        int KEEP_LWJGL_IMPORTS = GL_2_BYTES | GL_ALIASED_LINE_WIDTH_RANGE | GL_ACTIVE_TEXTURE | GL_BLEND_COLOR | GL_ARRAY_BUFFER | GL_ACTIVE_ATTRIBUTE_MAX_LENGTH | GL_COMPRESSED_SLUMINANCE | GL_ALPHA_INTEGER | GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH | GL_ALREADY_SIGNALED | GL_ANY_SAMPLES_PASSED | GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH | GL_ACTIVE_PROGRAM | GL_ACTIVE_ATOMIC_COUNTER_BUFFERS | GL_ACTIVE_RESOURCES | GL_BUFFER_IMMUTABLE_STORAGE;
        int KEEP_OWN_IMPORTS = UNIFORM_PROJECTION_MATRIX.getLocation() | VS_POSITION.getLocation();
    }
//</editor-fold>
    private static final float EPSILON = 0.0001f;

    private FloatBuffer data;
    private Program program;

    private final int width;
    private final int depth;

    private final Random random = new Random();
    private final float maxHeight = 8f;
    private final int maxDecayFactor = 5;
    private final float factor = 4f;

    public Terrain(final int width, final int depth) {
        this.width = width;
        this.depth = depth;
        data = generateRandomTerrain();
        data.clear();
    }

    @Override
    public void compileProgram() {
        program = new Program(
                new VertexShader("data/shaders/terrain.vs.glsl").compile(),
                new TessellationControlShader("data/shaders/terrain.tcs.glsl").compile(),
                new TessellationEvaluationShader("data/shaders/terrain.tes.glsl").compile(),
                new FragmentShader("data/shaders/terrain.fs.glsl").compile()
        ).compile().setUniforms(
                        UNIFORM_MODEL_MATRIX,
                        UNIFORM_VIEW_MATRIX,
                        UNIFORM_PROJECTION_MATRIX,
                        UNIFORM_SHADOW_MATRIX
                        );
    }

    @Override
    public Program getProgram() {
        return program;
    }

    @Override
    public int getDataSize() {
        return width * depth * 16;
    }

    @Override
    public FloatBuffer putData(final FloatBuffer dataBuffer) {
        return dataBuffer.put(data);
    }

    @Override
    public int getDataMode() {
        return GL_PATCHES;
    }

    @Override
    public void drawLightPass(final int offset, final Program lightProgram) {
        lightProgram.drawArrays(getDataMode(), offset, getDataSize());
    }

    @Override
    public void draw(final int offset) {
        program.use();
        program.drawArrays(getDataMode(), offset, getDataSize());
    }

    @Override
    public void delete() {
        program.delete();
    }

    public void refresh() {
        data.clear();
        data = generateRandomTerrain();
    }

    //...
}

Также для lightProgram который передается drawLightPassбыло гарантировано, что lightProgram.use() был вызван до этого, это может показаться не очевидным из кода.

Как видите, я звоню drawArrays в drawLightPass с аргументом GL_PATCHESтеперь это действительно должно пойти не так, как результат, и в результате во всей моей программе я понял, что каждая часть находится в тени, поэтому у меня есть следующие вопросы:

1) Моя текущая установка - проблема? (Лично я думаю, что это так.)

2) Как OpenGL может не выдавать ошибку, если я передаю GL_PATCHES когда на подключенном шейдере не включена тесселяция?

3) Как я могу это исправить, чтобы он также работал с Tesselation?

Если потребуется еще какой-то код, я выложу его, я просто не хочу слишком загромождать пост ненужным кодом.

0 ответов

Другие вопросы по тегам