OpenGL шейдеры и текстура с альфа-каналом

Здравствуйте.
Пытаюсь наложить текстуру с альфа-каналом на квад, используя шейдеры.
В OpenGL есть такое правило, что сначала должно быть нарисовано всё непрозрачное, а потом всё прозрачное в обратном порядке удаления от камеры. Оно и понятно. Тут никаких вопросов. Однако, это правило действует только в том случае, когда мы используем настоящую прозрачность. То есть, когда меняется четвёртый компонент цвета. Можно даже не использовать текстуру вообще. Объект всё-равно будет прозрачным.
А я сейчас говорю про обычную текстуру с альфа-каналом. В этом случае четвёртый компонент цвета равен еденице, то есть полностью непрозрачный. В этом случае через места, где у текстуры есть альфа-канал, должно быть видно всё что находится позади нее, несмотря на то что что четвёртый компонент цвета равен еденице. Думаю, понятно объяснил?
Однако, получается так, что если рисовать объекты без шейдеров, то всё работает. И не важно, в каком порядке рисовать объекты. А если с шейдерами, то текстура, у которой есть очень большие области с альфа-каналом, перекрывает собой всё, что было нарисовано после неё. Вчера 4 часа убил на то, чтобы это понять. Я думал, что в коде где-то ошибка.
А почему так? Может, в шейдере надо что-то дописать?

Забыл уточнить, что шейдеры и OpenGL версии 3.3 core profile. Создаётся так:

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* glfwWindow = glfwCreateWindow(viewportWidth, viewportHeight,
        (char*)"OpenGL 3.3 test: Textured font", nullptr, nullptr);

Так а шейдеры как создаются?

Всмысле как? Шейдерная программа и всё такое. Не понял вопроса.

Так и что в ней?)

вершинный шейдер и фрагментный шейдер.
код шейдеров нужен?

Ну так чем больше информации, тем больше вероятность понять проблему )

Это ж в целом должно быть возможно в OpenGL, значит проблема видимо в реализации.

шейдеры:

    GLchar* vertexShaderTextureSource = (GLchar*)
        "#version 330 core\n"
        "\n"
        "layout (location = 0) in vec4 a_Position;\n"
        "layout (location = 1) in vec4 a_Color;\n"
        "layout (location = 2) in vec4 a_TexCoords;\n"
        "\n"
        "out vec4 color;\n"
        "out vec2 coords;\n"
        "uniform mat4 u_Matrix;\n"
        "\n"
        "void main()\n"
        "{\n"
        "    color = a_Color;\n"
        "    coords = a_TexCoords.xy;\n"
        "    gl_Position = u_Matrix * a_Position;\n"
        "}\n";

    GLchar* fragmentShaderTextureSource = (GLchar*)
        "#version 330 core\n"
        "\n"
        "in vec4 color;\n"
        "in vec2 coords;\n"
        "out vec4 FragColor;\n"
        "uniform sampler2D textureSampler;\n"
        "\n"
        "void main()\n"
        "{\n"
        "    vec4 tex = texture(textureSampler, coords);\n"
        "    FragColor = tex * color;\n"
        "}\n";

если убрать эти строчки

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

то работает не зависимо от того, в каком порядке рисовать.

Кажется , нашёл. Забыл, что это на хабрахабре было.
Надо в шейдер добавить

    if (tex.a < 0.1f)
        discard;

Тогда, вроде, работает.