Световой проход для 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?
Если потребуется еще какой-то код, я выложу его, я просто не хочу слишком загромождать пост ненужным кодом.