Итак, у меня есть AtlasTexture, который содержит все тайлы, необходимые мне для рисования тайловой карты.
Прямо сейчас я пропускаю AtlasTexture через униформу, и идея состоит в том, чтобы изменить координату текстуры, чтобы выбрать только ту часть атласа, которая мне нужна.
Проблема в том, что я могу указать только фрагментный шейдер, чтобы вырезать текстуру из нулевого источника. Можно ли указать offsetX, чтобы сообщить шейдеру, где я хочу начать рисовать?
float vertices[] = {
// aPosition // aTextureCoordinate
0.0f, 0.0f, 0.0f, 0.0f,
100.0f, 0.0f, 1.0f, 0.0f,
0.0f, 100.0f, 0.0f, 1.0f,
100.0f, 100.0f, 1.0f, 1.0f,
};
uint32_t indices[] = {0, 1, 2, 2, 3, 1};
Вершинный шейдер
#version 330 core
layout(location = 0) in vec2 aPosition;
layout(location = 1) in vec2 aTextureCoordinate;
out vec2 textureCoordinate;
void main() {
gl_Position = vec4( aPosition.x, aPosition.y, 1.0f, 1.0f);
textureCoordinate = vec2(
aTextureCoordinate.x / 3.0f, // This selects the first tile in the uAtlasTexture
aTextureCoordinate.y
);
}
Фрагментный шейдер
#version 330 core
in vec2 textureCoordinate;
uniform sampler2D uAtlasTexture; // Has 3 tiles
out vec4 color;
void main() {
color = texture(uAtlasTexture, textureCoordinate);
}
vec2(1.0/3.0 + aTextureCoordinate.x / 3.0f, aTextureCoordinate.y);
выбирает вторую плитку. Используйте униформу вместо 1.0/3.0
Кстати. Если все ваши плитки имеют одинаковый размер, вы можете найти текстуры массива (не путать с массивами текстур) более удобными.
спасибо @Andrea, да, все мои плитки одного размера. как я могу использовать текстуры массива?
@ellipticaldoor khronos.org/opengl/wiki/Array_Texture предоставляет обзор, хотя я уверен, что есть и другие ресурсы.
Используйте переменную Uniform для смещения. vec2(1.0/3.0 + aTextureCoordinate.x / 3.0f, aTextureCoordinate.y);'
всегда вторая плитка. Вместо этого используйте юниформ-переменную для рисования разных частей и инициализируйте ее значением 1.0/3.0:
#version 330 core
layout(location = 0) in vec2 aPosition;
layout(location = 1) in vec2 aTextureCoordinate;
out vec2 textureCoordinate;
uniform float textureOffsetX;
void main() {
gl_Position = vec4( aPosition.x, aPosition.y, 1.0f, 1.0f);
textureCoordinate = vec2(
textureOffsetX + aTextureCoordinate.x / 3.0f,
aTextureCoordinate.y
);
}
но как применить смещение? Я могу выбрать только часть текстуры слева