Проблема при наложении текстур друг на друга
Кратко, моя программа рисует две картинки. Первую картинку(игровую карту) используя одну шейдерную программу, а для второй(изображение игрока) использует другую, т.е. для каждой картинки есть отдельный вершинный и фрагментный шейдер.
Зачем две шейдерные программы? По задумке, карта состоит из плиток, у каждой плитки есть свой номер(трава-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 рисовать так как я задумал? Для этого есть специальный метод?