Повторяющаяся текстура OpenGL вызывает вращение при повороте - PullRequest
1 голос
/ 08 сентября 2010

У меня есть текстура, которая рисуется на квад.Текстура - это повторяющийся шаблон в верхнем левом углу этого снимка экрана: http://img828.imageshack.us/img828/3305/blahpv.png Текстура opengl имеет размер всего 3 на 9 пикселей, а координаты текстуры, которые я передаю, очень большие, и они зацикливаются на текстуре 3x9:используя GL_REPEAT.Есть ли какое-нибудь объяснение странной интерференционной картины, замеченной на скриншоте?Текстура выглядит хорошо (повторяется идеально), когда квад полностью перпендикулярен камере ... скриншот с квадратом, повернутым на пару градусов.Кажется, что аномалии меняются по мере того, как квад изменяет свое расстояние до камеры или вращение, поэтому я думаю, что это как-то связано с выборкой текстур и округлением с плавающей запятой, но я не уверен, как это исправить.

Обновление № 1:

Я не использую шейдеры, но сейчас я делаю это на python для каждой вершины:

(x0, y0, z0) = gluProject(vert[0].x, vert[0].y, 0.0)
x0 /= maskTextureWidth # 3.0
y0 /= maskTextureHeight # 9.0
glMultiTexCoord2f(GL_TEXTURE1_ARB, x0, y0)
glVertex2f(vert[0].x, vert[0].y)

Ответы [ 3 ]

0 голосов
/ 10 сентября 2010

Хорошо, так что вы хотите повернуть квад, но не текстуру, верно?

Вы можете легко сделать это в своих шейдерах (некоторые части отсутствуют, как, например, объявление сэмплера)

Вершинный шейдер:

 out vec2 UV;
 main(){
     gl_Position = MVP * Position;
     UV = gl_Position.xy / gl_Position.w;
 }

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

in vec2 UV;
main(){
    outColor = texture(sampler, UV);
}

Более того, вам даже не нужно предоставлять координаты текстуры: они вычисляются во время выполнения.

Другая возможность, менее инвазивная, если у вас нет шейдеров, - это пересчитать ваши UV так же, как в вершинном шейдере.

Еще одна возможность - glBitmap, но этокакой-то очень старый кусок API ...

0 голосов
/ 11 сентября 2010

Ответ № 2:

используйте glTexGen

http://www.dei.isep.ipp.pt/~matos/cg/docs/manual/glTexGen.3G.html

с аргументами (GL_S, GL_T), GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR (я думаю; обойти со значением, если оно неверно)

0 голосов
/ 09 сентября 2010

Ну, не зная, какое вращение вы применили, мы можем только предполагать, что это какой-то узор муара, который только формируется (где мешающие сетки - это ваша текстура и сетка растеризации).

Почему вы называете этоаномалии (или, что более важно, что вы хотите в результате)?

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
...