Проблема при наложении текстур друг на друга

Кратко, моя программа рисует две картинки. Первую картинку(игровую карту) используя одну шейдерную программу, а для второй(изображение игрока) использует другую, т.е. для каждой картинки есть отдельный вершинный и фрагментный шейдер.

Зачем две шейдерные программы? По задумке, карта состоит из плиток, у каждой плитки есть свой номер(трава-1, лава-0 и т.д.) В текстовом файле хранится последовательность номеров тайлов через запятую. Этот файл передается в программу, и она преобразует его в монолитный список координат вершин. Этот список передается в шейдер, где координаты каждой вершины по очереди передаются далее по конвейеру через gl_Position. Чтобы в этом же шейдере хранить координаты вершин игрока, эти координаты нужно засунуть в тот монолитный(т.е. не изменяемый) список ещё и их. Короче, проще создать для игрока отдельную шейдерную программу.

Итог:

введите сюда описание изображения

Если что, текстура игрока прозрачная, т.е. там где видно черную область - это цвет, установленный GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f);

Получается, что при отрисовке игрока удаляются те пиксели текстуры травки, которые находятся под ним.

По задумке результат должен быть такой:

введите сюда описание изображения

На всякий прикреплю код шейдеров:

Вершинный шейдер игрока

#version 330 core

layout (location = 0) in vec3 aPosition;

layout (location = 1) in vec2 aTexCoord;

uniform mat4 view;
uniform mat4 projection;

out vec2 TexCoord;

void main()
{
TexCoord = aTexCoord;
gl_Position = vec4(aPosition, 1.0f) * view * projection;
}

Фрагментный шейдер игрока

#version 330 core
out vec4 FragColor;

in vec2 TexCoord;

uniform sampler2D player;

void main()
{   
FragColor = texture(player, TexCoord);    
}

Вершинный шейдер карты

#version 330 core

layout (location = 0) in vec3 aPosition;

layout (location = 1) in vec2 aTexCoord;

layout (location = 2) in float aTileType;

uniform mat4 view;
uniform mat4 projection;

out vec2 TexCoord;
out float TileType;

void main()
{
TexCoord = aTexCoord;
TileType = aTileType;
gl_Position = vec4(aPosition, 1.0f) * view * projection;
}

Фрагментный шейдер карты

#version 330 core
out vec4 FragColor;

in vec2 TexCoord;
in float TileType;

uniform sampler2D ground;
uniform sampler2D lava;
void main()
{   
if(TileType == 0.0f)
{
     FragColor = texture(lava, TexCoord);    
}
if(TileType == 1.0f)
{
     FragColor = texture(ground, TexCoord);    
}
}

Шейдерные программы вызываются последовательно, сначала программа карты, затем игрока

Есть ли способ заставить opengl рисовать так как я задумал? Для этого есть специальный метод?


Ответы (0 шт):