Проблеммы с отрисовкой при использовании индексных массивов OpenGl

Модератор: Модераторы разделов

Аватара пользователя
Stvad
Сообщения: 106
ОС: Gentoo Linux

Проблеммы с отрисовкой при использовании индексных массивов OpenGl

Сообщение Stvad »

Предистория
собственно сам проэкт - игра лабиринт.
на данном этапе надо нарисовать нарисовать кубик и использовать для отрисовки индексные массивы.
со стандартной отрисовкой кубик рисовался нормально сейчас же получается вот такая фигня:
http://dump.bitcheese.net/images/html/seveboj/le.jpeg.html
какие могут быть тому причины? вот сам проэкт: http://dump.bitcheese.net/files/rukujaz/La...tEditor.tar.bz2
используемые инструменты c++, qt, opengl.
создание массивов вершин и индексов происходит в файле boxcretor.h
P.S
вот такая еще фигня обнаружилась:
IVerticalPlane и IVerticalPlaneNext - две противоположные стороны бокса перед рисованием IVerticalPlaneNext должно изменяется Position.z на заданную ддлину бокса и он должен рисоватся сдвинутым ... а оно и если сдвигать и если закомментировать изменение Position.z рисует одноитоже...
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: Проблеммы с отрисовкой при использовании индексных массивов OpenGl

Сообщение Alxn1 »

Посмотрел я ваш код. Вы просто не совсем понимаете, что такое индексный буфер, и что в них должно храниться.

Смотрите, у вас есть буфер вершин. Их там, предположим, 4-е - это углы квадрата. Буфер вершин - это, собственно, массив вершин. Таким образом, верхняя левая вершина квадрата будет иметь индекс в массиве 0, верхняя правая - 1, нижняя правая - 2, и оставшаяся вершина (нижняя левая) - 3. (Тут хорошо бы нарисовать на бумажке квадрат, и расставить у вершин номера).

Теперь проведите линию из вершины 0 в вершину 2. У вас получится на рисунке 2 треугольника, образующих квадрат. Обходим по часовой стрелке оба треугольника и записываем подряд индексы вершин этих треугольников: 0, 1, 2, 0, 2, 3 - вот это вот и есть соответствующий индексный буфер, с помощью которого из вертексного буфера на 4-е вертекса мы можем нарисовать квадрат из 2-х треугольников.

Ничего сложного, в общем, если рисовать на бумаге :) Аналогично можно так на бумаге нарисовать кубик, триангулировать его (разбить на треугольники), пронумеровать вершины и обойти все треугольники по часовой стрелке - и построить буфер индексов для кубика :) Главное только, что бы в вертексном буфере вертексы лежали в том же порядке, в котором вы их пронумеровали :)

И вот пример кода для построения одной грани куба (я взял за основу ваш код и немного порисовал):

Код: Выделить всё

Box BoxCreator::CreateBox(     Point3D Position,
                            float Width,
                            float Height,
                            float Length,
                            float VertexPerWidth,
                            float VertexPerHeight,
                            float VertexPerLength )
{
    points.clear();
    indexes.clear();

    float dx = Width / VertexPerWidth;
    float dy = Height / VertexPerHeight;
    float dz = Length / VertexPerLength;

    Vertex     temp;
    int     currentVertexNumber     = 0;
    int        countVertexesPerWidth     = VertexPerWidth;
    int        lastLineIndexStart        = VertexPerWidth * VertexPerHeight - VertexPerWidth - 1;

    temp.Position.z = Position.z + Length / 2.0;

    for( float y = 0.0; y < Height; y += dy )
    for( float x = 0.0; x < Width; x += dx )
    {
        temp.Position.x = Position.x - Width / 2.0 + x;
        temp.Position.y = Position.y - Height / 2.0 + y;

        points.push_back( temp );

        if( ( ( currentVertexNumber + 1 ) % countVertexesPerWidth ) != 0 &&
            currentVertexNumber < lastLineIndexStart  ||
            currentVertexNumber == 0 )
        {
            indexes.push_back( currentVertexNumber );
            indexes.push_back( currentVertexNumber + 1 );
            indexes.push_back( currentVertexNumber + countVertexesPerWidth + 1 );
            indexes.push_back( currentVertexNumber );
            indexes.push_back( currentVertexNumber + countVertexesPerWidth + 1 );
            indexes.push_back( currentVertexNumber + countVertexesPerWidth );
        }

        currentVertexNumber++;
    }

    return Box( points, indexes );
}


Весь кубик лень было рисовать, да и вам самому будет интереснее, думаю :)
Спасибо сказали: