Используя шейдер, я пытаюсь раскрасить плоскость так, чтобы она воспроизводила пиксели текстуры. Текстура имеет размер 32x32 пикселя, а плоскость также имеет размер 32x32 в пространственных координатах.
Кто-нибудь знает, как мне проверить первый пиксель на текстуре, а затем использовать его, чтобы раскрасить первый квадрат (1x1) на плоскости?
Пример сгенерированной текстуры: (Первый пиксель специально красный)
Этот код, использующий vec2 с координатами (0,0), работает не так, как я ожидал. Я предположил, что цвет в точке (0,0) будет красным, но это не так, он зеленый:
vec4 color = texture2D(texture, vec2(0, 0));
Я предполагаю, что есть что-то, чего мне не хватает, или я не понимаю texture2D, поскольку (0,0) тоже не является конечным пикселем.
Если бы кто-нибудь мог мне помочь, я был бы очень признателен. Спасибо.
РЕДАКТИРОВАТЬ:
Спасибо за комментарии и ответы! Используя этот код, теперь он работает:
// Flip the texture vertically
vec3 verpos2 = verpos.xyz * vec3(1.0, 1.0, -1.0);
// Calculate the pixel coordinates the fragment belongs to
float pixX = floor(verpos2.x - floor(verpos2.x / 32.0) * 32.0);
float pixZ = floor(verpos2.z - floor(verpos2.z / 32.0) * 32.0);
float texX = (pixX + 0.5) / 32.0;
float texZ = (pixZ + 0.5) / 32.0;
gl_FragColor = texture2D(texture, vec2(texX, texZ));
Тем не менее, у меня проблема с неровными линиями по краям каждого «блока». Мне кажется, что у меня нет математики, и я не понимаю, какого цвета должны быть стороны, потому что у меня не было этой проблемы при использовании только цветов вершин. Может ли кто-нибудь увидеть, где я ошибся или как это можно было бы улучшить?
Еще раз спасибо!