Почему рендеринг и выборка из текстуры требуют смещения?
У меня есть 2 аналогичные версии вершинного шейдера, которые производят немного разные текстуры.
Первая такая версия выглядит следующим образом:
#version 450
layout(location = 0) in vec3 position; //(x,y,z) coordinates of a vertex
layout(location = 1) in vec3 norm; //a 3D vertex representing the normal to the vertex
layout(location = 2) in vec2 texture_coordinate; // texture coordinates
layout(std430, binding = 3) buffer instance_buffer
{
vec4 cubes_info[];//first 3 values are position of object
};
out vec3 normalized_pos;
out vec3 normal;
out vec2 texture_coord;
uniform float width = 128;
uniform float depth = 128;
uniform float height = 128;
void main()
{
texture_coord = texture_coordinate;
vec4 pos = (vec4(position, 1.0) + vec4(vec3(cubes_info[gl_InstanceID]),0));
pos+=ivec4(1,1,0,0);
pos.x = (2.f*pos.x-width)/(width);
pos.y = (2.f*pos.y-depth)/(depth);
pos.z = 0.9;
gl_Position = pos;
normalized_pos = vec3(pos);
normal = normalize(norm);
}
Который производит:
Посмотрите на границу, особенно внизу, и обратите внимание на отдельные пиксели рядом с левым дном.
Теперь следующая версия:
#version 450
layout(location = 0) in vec3 position; //(x,y,z) coordinates of a vertex
layout(location = 1) in vec3 norm; //a 3D vertex representing the normal to the vertex
layout(location = 2) in vec2 texture_coordinate; // texture coordinates
layout(std430, binding = 3) buffer instance_buffer
{
vec4 cubes_info[];//first 3 values are position of object
};
out vec3 normalized_pos;
out vec3 normal;
out vec2 texture_coord;
uniform float width = 128;
uniform float depth = 128;
uniform float height = 128;
void main()
{
texture_coord = texture_coordinate;
vec4 pos = (vec4(position, 1.0) + vec4(vec3(cubes_info[gl_InstanceID]),0));
// pos+=ivec4(1,1,0,0); <- Look here, we're not offsetting anymore
pos.x = (2.f*pos.x-width)/(width);
pos.y = (2.f*pos.y-depth)/(depth);
pos.z = 0.9;
gl_Position = pos;
normalized_pos = vec3(pos);
normal = normalize(norm);
}
Неудивительно, что когда мы не добавляем это смещение, изображение смещается (пиксели внизу исчезли, и мы знаем, что на верхнем и правом краях есть пустая граница). Мой вопрос: почему это смещение необходимо для начала?
Почему не отображение
pos.x = (2.f*pos.x-width)/(width);
pos.y = (2.f*pos.y-depth)/(depth);
Напрямую рассчитать правильный тексель?
Редактировать:
Некоторые уточнения основаны на комментарии.
Изображения, которые вы видите, представляют собой слои трехмерной текстуры. Хотя это может варьироваться, мы можем предположить, что координаты x,y будут в диапазоне [0,width-1] и [0,deep-1] (в данном случае 127 для обоих).