2010-03-07 2 views
1

При рисовании текстур OpenGL ES они, похоже, «привязываются» к круглым пиксельным местоположениям, как если бы округление было округлено. то есть. рисунок (x: 1.1, y: 5.4) на самом деле рисует на (x: 1, y: 5). Это заставляет текстуры казаться «прыгать» при прокрутке, а не плавно перемещаться.Невозможно нарисовать текстуры OpenGL ES в некруглых местах

Да, я использую плавающие типы для моих вершин и т.д.

рисования линий и т.д. отлично работает с некруглыми местами.

Есть только два фактора в месте текселя:

  1. перевод видовом: glTranslatef(viewWidth/2.0f, viewHeight/2.0f, 0.0f);

  2. Место Жеребьевка: glVertexPointer(...); // see below

Я использую следующий код для рисования текстуры:

glTranslatef(scrollX, scrollY, 0.0f); 

... 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 

// Overlay map. 
glTexCoordPointer(2, GL_FLOAT, 0, textureSTs); 
glBindTexture(GL_TEXTURE_2D, texture.glTtextureKeyD); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

GLfloat vertices[] = { 
x1, y2, 
x1, y1, 
x2, y1, 
x2, y2, 
}; 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

Я что-то упустил?

+0

Что такое типы для scrollX и scrollY? возможно, вы обрабатываете их как ints, даже если они плавают? – fazo

ответ

2

Ваш код загрузки изображений, скорее всего, с помощью GL_NEAREST фильтрации, если вы хотите получить хорошую фильтрацию для промежуточных значений пикселей наилучшим выбором является GL_LINEAR-фильтрация. Попробуйте поместить glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); после связывания. Использование FSAA также может уменьшить эффект.

Другая возможность в ваших координатах текстуры, попробуйте отрегулировать их на 1/2 пикселя. Поэтому, если ваша текстура 256 * 256 добавить .5/256 к значению с плавающей запятой каждой координаты.

+0

Это была именно эта проблема. Спасибо, Мехран и PeanutPower. –

1

являются вашим x1, y2, x1, y1, x2 , y1, x2, y2,

поплавков или они усекаются?

также код, который устанавливает x1, y1 и т. Д., Вы бросаете в поплавки, прежде чем делать раздельное умножение и т. Д.?

x1 = (поплавок) somevar * 0.5f

и то же самое для scrollX, которые вы подаете в gltranslate

+0

Хорошая догадка, но я использую CGFloats. –

+0

, так что все операнды являются поплавками в ваших математических высказываниях? – PeanutPower

+0

, может быть, попробуйте вызвать glLoadIdentity, чтобы убедиться, что ваш перевод является чистым? – PeanutPower

Смежные вопросы