Почему рендеринг и выборка из текстуры требуют смещения?

У меня есть 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 для обоих).

0 ответов

Другие вопросы по тегам