Направленный свет шейдера LWJGL GLSL появляется наизнанку

Когда я рендеринг куба VBO с использованием направленного шейдера света, свет появляется "наизнанку". (Извините, если я не могу объяснить это лучше).

за пределами

внутри

Вот мой код вершинного шейдера (мой фрагментный шейдер просто применяет цвет, вся работа выполняется в вершинном шейдере).

#version 150 core
in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;
in vec3 in_Normal;

uniform sampler2D texture;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform mat3 normalMatrix;
uniform vec3 lDir;

out vec4 color;

void main(void) {
    mat3 nMat = normalMatrix;
    vec3 normal = normalize(in_Normal * nMat);
    vec3 dir = normalize(lDir);
    float nl = max(dot(dir, normal), 0.25);
    //color = NdotL * vec4(0,1,0,1);
    color = vec4(0,1,0,1) * nl;
    gl_Position = projection * view * model * in_Position;
}

Равномерная переменная lDir хранит массив float[] {0,1,1}. Единая переменная normalMatrix вычисляется следующим образом.

    FloatBuffer preBuffer = BufferUtils.createFloatBuffer(16);
    modelMatrix.store(preBuffer);
    preBuffer.flip();
    Matrix4f preMat = new Matrix4f();
    preMat.load(preBuffer);

    Matrix3f preModel3f;
    Matrix3f normal3f = new Matrix3f();
    preModel3f = Tk.to3f(preMat);
    preModel3f.transpose(normal3f);
    normal3f.invert();

    normal3f.store(nmBuffer);
    nmBuffer.flip();
    glUniformMatrix3(glGetUniformLocation(ss.pId, "normalMatrix"), false, nmBuffer);

Переменная modelMatrix не требует пояснений, за исключением того факта, что это буфер, а не матрица. Переменная normal3f хранит транспонированную инверсию матрицы модели (я уверен, что это правильный способ вычисления нормальной матрицы). Я должен поместить буфер modelMatrix в буфер с именем preBuffer, если я не получаю ошибки по какой-то причине.

Оставьте комментарий, если вам нужно что-то еще, чтобы помочь решить эту проблему.

1 ответ

Решение

Я выяснил проблему, когда я рендерил текст на экран (текст, описывающий проблему с кубом), я забыл установить glBlendFunc() обратно в этот параметр,

glBlendFunc(GL_ONE, GL_ZERO);

Это вызывало проблему прозрачности, а также решало некоторые другие проблемы.

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