Координаты текстуры OpenGL в пиксельном пространстве

Я работаю над iPhone-приложением, которое использует OpenGL ES 2 для его рисования. Я знаю, что обычно координаты текстуры определены в диапазоне 0-1, но в идеале я хотел бы сопоставить их с 0-1023 (размер моего TextureAtlas) для удобства чтения. Я видел пример кода, который определяет координаты таким образом, но не смог рассказать, какие предыдущие вызовы были сделаны, что позволило это. glMatrixMode(GL_TEXTURE) похоже, что он может быть задействован, но я не совсем уверен, как его реализовать.

Моя конечная цель состояла бы в том, чтобы выполнить что-то подобное, где текстура, которую я буду использовать внутри атласа, находится в верхнем левом 48px-квадрате:

GLshort texcoords[]={
  48,48,
  0,48,
  48,0,
  0,0,
};
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_SHORT, 0, 0, texcoords);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

Ответы

Ответ 1

Оказывается, это возможно в OpenGl ES 2. Вот как я это сделал:

Фрагментный шейдер:

precision mediump float; 
varying vec2 v_texCoord;
uniform sampler2D textureSample;
uniform float texScale;
void main()
{
    vec2 mult=(2.0*v_texCoord - 1.0)/(2.0*texScale);
    gl_FragColor = texture2D(textureSample,mult);
}

Obj-C:

GLshort texCoords[]={
    512,512,
    0,512,
    512,0,
    0,0,
};
GLfloat textureWidth = 512.0; //texture size, assumed square, power of 2
texCoordLoc = glGetAttribLocation ( program, "a_texCoord");
GLuint textureScale = glGetUniformLocation ( program, "texScale");
glUniform1f(textureScale, textureWidth);
glVertexAttribPointer ( texCoordLoc, 2, GL_SHORT, GL_FALSE, 0, texCoords);

Если у кого-то есть комментарии относительно того, как это может работать с точки зрения производительности, мне было бы интересно.

Ответ 2

Это задавали несколько раз, но у меня нет ссылок, поэтому быстрое и грубое объяснение. Скажем, текстура имеет ширину 8 пикселей:

 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
 ^   ^   ^   ^   ^   ^   ^   ^   ^
0.0  |   |   |   |   |   |   |  1.0
 |   |   |   |   |   |   |   |   |
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8

Цифры обозначают пиксели текстуры, штрихи к краям текстуры и в случае ближайшей фильтрации границы между пикселями. Однако вы хотите поразить центры пикселей. Итак, вас интересуют координаты текстуры

(0/8 + 1/8)/2 = 1/(2 * 8)

(1/8 + 2/8)/2 = 3/(2 * 8)

...

(7/8 + 8/8)/2 = 15/(2 * 8)

Или, в общем случае, для пикселя я в широкой текстуре N правильная координата текстуры

(2i + 1)/(2N)

Однако, если вы хотите идеально согласовать текстуру с пикселями экрана, помните, что то, что вы указываете как координаты, не является квадратным, а края, которые в зависимости от проекции могут совпадать с краями пикселов экрана, а не центрами, требуют других координат текстуры.

Ответ 3

Я теряю 1 час, чтобы найти интуитивную фигуру, но на удивление никто не рисовал. Так я и сделал.

Учитывая текстуру в 4 пикселя, нормализованная координата текстуры [0,1], ненормализованная координата текстуры [0, ширина), gl_FragCoord [0, width] следующие

введите описание изображения здесь

Ссылка