Текстурированный glDrawElement

У меня проблемы с текстурированием моей 3D-модели, я просто погружаюсь в 3D-модели, поскольку использую базовые примитивы для целей тестирования и работаю над кодом, более специфичным для движка. Однако у меня возникли проблемы с функцией glDrawElements, я знаю, что моя текстура загружена правильно, так как я могу нарисовать ее в четырехугольник (обратите внимание на glBegin в комментариях). Однако при использовании glDrawElements текстура не рисуется. Он показывает цвет части текстуры (желтый), и когда я удаляю код текстурирования, он возвращает 3D-модели последний установленный цвет, поэтому он что-то делает. Я думаю, может быть, это как-то связано с моим glVertexAttributePointer , я понимаю, что делают эти функции.

glMatrixMode(GL_MODELVIEW);
    glMultMatrixf(m_Props.WorldMatrix.data);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), 0);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)12);
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)20);

    glBindBuffer(GL_ARRAY_BUFFER, pExtra->GetVB());
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pExtra->GetIB());

    glScalef(0.05, 0.05, 0.05);

    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, pTexExtra->GetTexture());

     glDrawElements(GL_TRIANGLES, pExtra->GetIndexCount(), GL_UNSIGNED_INT, 0); 
     /*glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(0.0f, 0.0f, 0.0f);
        glTexCoord2f(0, 1); glVertex3f(10.0f, 0.0f, 0.0f);
        glTexCoord2f(1, 1); glVertex3f(10.0f, 10.0f, 0.0f);
        glTexCoord2f(1, 0); glVertex3f(0.0f, 10.0f, 0.0f);
     glEnd();*/

    glDisable(GL_TEXTURE_2D);


    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);

Мой класс VertexPTN — это просто контейнер для Position, Texture Coordinate и Normal. Итак, я предполагаю, что позиционирование моих векторов в классе идет; Vector3f, Vector2f, Vector3f, я бы установил последний параметр glVertexAttributePointer на 0, 12, 20.

Есть ли какое-то непонимание того, что я упускаю? Я действительно не профессионал в openGL, но я хорошо разбираюсь в настройке и базовом рендеринге. Что заставляет мою текстуру не отображаться в моей сетке, неустановленное состояние GL?


person user1294021    schedule 15.05.2012    source источник
comment
Просто подсказка (не относящаяся к вашей проблеме (вероятно)): вы никогда не должны жестко кодировать смещения структуры памяти. Вместо этого позвольте компилятору понять это. Для этого есть макрос offsetof ANSI C: en.wikipedia.org/wiki/Offsetof — используйте это для параметра данных VBO.   -  person datenwolf    schedule 15.05.2012


Ответы (1)


Некоторые мысли:

Вы используете шейдеры? glVertexAttribPointer работает только с шейдерами

  • Если да: вы уверены, что вводите значения 0, 1 и 2? Если вы не установите их перед связыванием шейдера с glBindAttribLocation, они не обязательно будут какими-либо конкретными значениями.
  • Если нет: следует использовать glVertexPointer, glTexCoordPointer и т. д. вместо AttribPointer.

Также, если вы используете шейдеры, то включение/выключение GL_TEXTURE_2D избыточно, оно ничего не делает.

person Tim    schedule 15.05.2012
comment
У меня вообще нет шейдеров, поэтому я полагаю, что это причина, по которой это не сработает. Также у меня есть несколько тестовых объектов, которые просто используют диффузный цвет, по какой-то причине даже без указания glTexCoord он сделал их желтоватыми. Я посмотрю, используя их, спасибо. - person user1294021; 15.05.2012
comment
Теперь у меня есть glVertexPointer(3, GL_FLOAT, sizeof(GL_FLOAT) * 3, &pExtra->GetVB()[0]); glNormalPointer(GL_FLOAT, sizeof(GL_FLOAT) * 3, &pExtra->GetNB()[0]); glTexCoordPointer(2, GL_FLOAT, sizeof(GL_FLOAT) * 2, &pExtra->GetTB()[0]); glDrawElements(GL_TRIANGLES, pExtra->GetIB().size(), GL_UNSIGNED_SHORT, &pExtra->GetIB()[0]); ‹p› Я изменил Vertex Buffers с буферов, сгенерированных GLuint, на простые векторы stl, в которые я закачал вершины, нормали, координаты tex. Затем я прямо указываю gl на эти вектора, поскольку они непрерывны. Но теперь я даже не вижу свою модель, что я делаю не так? - person user1294021; 15.05.2012
comment
@ user1294021 Вам также нужно будет заменить glEnableVertexAttribArray различными вызовами glEnableClientState, чтобы включить GL_VERTEX_ARRAY, GL_TEXCOORD_ARRAY и GL_NORMAL_ARRAY. - person Tim; 15.05.2012