Координаты текстуры 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] следующие
![введите описание изображения здесь]()
Ссылка