Проблема с полупрозрачным ландшафтом (возможно, проблемы с буфером глубины) - PullRequest
0 голосов
/ 12 ноября 2018

У меня проблемы с рендерингом. Блоки рендеринга в какой-то степени полупрозрачные. Все хорошо, пока я использую видеокарты Nvidia. На видеокартах Intel (интегрированных) или AMD это выглядит так:

enter image description here

Как вы можете видеть, есть рендеринг блоков, которые должны быть позади других.

Это мои методы подготовки.

    public void prepare()
    {
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.ClearColor(skyColour.X, skyColour.Y, skyColour.Z, 0f);
    }

    public void enableGLCaps()
    {
        GL.Enable(EnableCap.DepthTest);
        GL.Enable(EnableCap.DepthClamp);

        GL.Enable(EnableCap.CullFace);
        GL.CullFace(CullFaceMode.Back);

        GL.Enable(EnableCap.Blend);
        GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
    }

Это мой вершинный шейдер:

#version 440
in vec3 position;
in vec2 textureCoords;

out vec2 pass_textureCoords;
out float visibility;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform float density;
uniform float gradient;

void main() {
    vec4 worldPosition = transformationMatrix * vec4(position, 1.0);
    vec4 positionRelativeToCam = viewMatrix * worldPosition;
    gl_Position = projectionMatrix * positionRelativeToCam;

    pass_textureCoords = textureCoords;
    float distance = length(positionRelativeToCam.xyz);
    visibility = exp(-pow((distance*density), gradient));
    visibility = clamp(visibility, 0.0, 1.0);

}

А вот и мой фрагментный шейдер:

#version 440

uniform sampler2D textureSampler;
uniform vec3 skyColour;

in vec2 pass_textureCoords;
in float visibility;

out vec4 color;

void main() {

    vec4 textureColour = texture(textureSampler, pass_textureCoords);
    if (textureColour.a < 0.5)
        discard;

    color = mix(vec4(skyColour, 1.0), textureColour, visibility);
    color.a = 1;
}

Смена ближнего самолета не помогает.

РЕДАКТИРОВАТЬ 1:

Я визуализировал значение z и заметил, что некоторые лица определенно не имеют правильного значения. Я рендерил каждую текстуру в регионе (16 * 16 * 16 блоков) как один VAO (позже буду использовать атласы текстур, но я столкнулся с мерцанием / наложением с использованием mipmapping, используя его). Лица, которые визуализируются как один VAO, не перекрывают друг друга, поэтому буфер z, похоже, в порядке. Похоже, его проверяют после каждого рендеринга. Вот мой рендер:

GL.DrawElements(BeginMode.Quads, vertices, DrawElementsType.UnsignedInt, 0);

РЕШЕНИЕ:

Функция глубины, которую я использовал, была неправильной. Вы должны использовать Lequal. Я также должен был установить диапазон глубины (0, 1).

...