2014-10-19 2 views
0

У меня есть следующий код, чтобы попытаться нарисовать прямоугольник с помощью вершинных массивов:OpenGL координаты текстуры быть искажены при использовании вершинных массивов

glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT, 0, &mNorms[ 0 ]); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, &mTexCrds[ 0 ]); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, &mVtxs[ 0 ]); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Цель состоит в том, чтобы нарисовать простой прямоугольник с помощью треугольника полосы, используя угловой шаблон Far Left, Near Left, Far Right, Near Right. Переменные значения следующие:

 
     /* far left    near left   far right    near right */ 
mNorms { 0.0, 1.0, 0.0,   0.0, 1.0, 0.0,  0.0, 1.0, 0.0,  0.0, 1.0, 0.0 } 
mTexCrds { 0.0, 1.0,    0.0, 0.0,   1.0, 1.0,    1.0, 0.0 } 
mVtxs { -25.0, 0.0, -100.0, -25.0, 0.0, -50.0, 25.0, 0.0, -100.0, 25.0, 0.0, -50.0 } 

Моя текстура - это черная плитка с тонкой синей рамкой вокруг всех краев. Когда прямоугольник рисуется с помощью вышеуказанных инструкций, он полностью синий:

bad.jpg http://www.graemecentralstation.com/img/bad.jpg

Очевидно, что с учетом приведенных выше текстурные координаты Я ожидаю моего 2D текстуры, чтобы быть полностью видимым.

Если я заменяю glDrawArrays() с вручную вызова, используя одни и те же данные массива, как это ...

glBegin(GL_TRIANGLE_STRIP); 
{ 
    for(int i = 0; i < 4; ++i) 
    { 
     glNormal3fv(&mNorms[ i * 3 ]); 
     glTexCoord2fv(&mTexCrds[ i * 2 ]); 
     glVertex3fv(&mVtxs[ i * 3 ]); 
    } 
} 
glEnd(); 

... то прямоугольник рисуется с картой полная текстура изображения видимого, как я ожидал:

good.jpg http://www.graemecentralstation.com/img/good.jpg

Любая идея, почему glDrawArrays() будет искажать мою текстуру так плохо?

+1

IMO, если вы столкнулись со всей проблемой настройки 'glVertexPointer' и т. Д., Вы можете просто использовать объекты буфера вершин. Скорее всего, это будет лучше. –

ответ

-1

Вы, возможно, потребуется добавить
glActiveTextureARB(GL_TEXTURE0_ARB); glBindTexture(GL_TEXTURE_2D,texID);

непосредственно перед glEnableClientState(GL_TEXTURE_COORD_ARRAY);

0

Вы можете попробовать отлаживать с помощью текстурных координат как цвета в пиксельный шейдер, так, то вы можете увидеть ли координаты текстуры правильно. gl_FragColor = vec4(vec2(texCoord),0,1);