Конференция "Игры" » glVertexAttribPointerARB [Delphi, Windows]
 
  • CrytoGen (16.06.08 11:21) [0]
    Пытаюсь переделать программу:

     glVertexAttribPointerARB(ar, 1, GL_FLOAT, GL_FALSE, 0, @ars);
     glBegin(GL_TRIANGLES);
       for i:=Low(Triangles) to High(Triangles) do
       begin
    //      glsl.SetAttrib(ar,ars[Triangles[i].a]);
         glNormal3f(Grid[Triangles[i].a].x,Grid[Triangles[i].a].y,Grid[Triangles[i].a].z) ;
         glVertex3f(Grid[Triangles[i].a].x,Grid[Triangles[i].a].y,Grid[Triangles[i].a].z) ;
    //      glsl.SetAttrib(ar,ars[Triangles[i].b]);
         glNormal3f(Grid[Triangles[i].b].x,Grid[Triangles[i].b].y,Grid[Triangles[i].b].z) ;
         glVertex3f(Grid[Triangles[i].b].x,Grid[Triangles[i].b].y,Grid[Triangles[i].b].z) ;
    //      glsl.SetAttrib(ar,ars[Triangles[i].c]);
         glNormal3f(Grid[Triangles[i].c].x,Grid[Triangles[i].c].y,Grid[Triangles[i].c].z) ;
         glVertex3f(Grid[Triangles[i].c].x,Grid[Triangles[i].c].y,Grid[Triangles[i].c].z) ;
       end;
     glEnd;
     glDisableVertexAttribArrayARB(ar);


    Если убрать glVertexAttribPointerARB и раскоментировать SetAttrib(glUniform), то всё работает,а с VertexAttribPointer не хочет.
    И сразу вопрос, при переходе к VBO можно также продолжать пользоваться VertexAttribPointer?
  • CrytoGen (16.06.08 11:44) [1]
    Свою ошибку понял.
    Однако вопрос теперь стоит так:

     glEnableClientState(GL_VERTEX_ARRAY);
     glEnableClientState(GL_NORMAL_ARRAY);
     glEnableVertexAttribArrayARB(ar);
     glVertexAttribPointerARB(ar, 1, GL_FLOAT, GL_FALSE, 0, attr);
     glVertexPointer(3,GL_FLOAT,SizeOf(TVector),vert);
     glNormalPointer(GL_FLOAT,SizeOf(TVector),vert);
     glDrawElements(GL_TRIANGLES,Length(Triangles)*3,GL_UNSIGNED_INT,tri);
     glDisableVertexAttribArrayARB(ar);


    рабоает, а

     glEnableVertexAttribArrayARB(ar);
     glEnableClientState(GL_VERTEX_ARRAY);
     glEnableClientState(GL_NORMAL_ARRAY);

     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,VBO[3]);
     glBindBufferARB(GL_ARRAY_BUFFER_ARB,VBO[0]);
     glVertexPointer(3,GL_FLOAT,SizeOf(TVector),nil);
     glBindBufferARB(GL_ARRAY_BUFFER_ARB,VBO[1]);
     glNormalPointer(GL_FLOAT,SizeOf(TVector),nil);
     glVertexAttribPointerARB(ar,1,GL_FLOAT,GL_FALSE,0,attr);
     glDrawElements(GL_TRIANGLES,Length(Triangles)*3,GL_UNSIGNED_INT,nil);
     glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0);
     glDisableVertexAttribArrayARB(ar);


    не работает.
  • XProger © (16.06.08 12:40) [2]
    glVertexAttribPointerARB(ar,1,GL_FLOAT,GL_FALSE,0,attr);
    В варианте с VBO, attr является смещением по буферу?
  • CrytoGen (16.06.08 16:10) [3]
    Я уже разобрался.
    attr это массив с аттрибутами
    удалось запустить когда перенёс glVertexAttribPointerARB сразу за glEnableVertexAttribArrayARB
    т.е. после переноса:
     glEnableVertexAttribArrayARB(ar);
     glVertexAttribPointerARB(ar,1,GL_FLOAT,GL_FALSE,0,attr);  
     glEnableClientState(GL_VERTEX_ARRAY);
     glEnableClientState(GL_NORMAL_ARRAY);
     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,VBO[3]);
     glBindBufferARB(GL_ARRAY_BUFFER_ARB,VBO[0]);
     glVertexPointer(3,GL_FLOAT,SizeOf(TVector),nil);
     glBindBufferARB(GL_ARRAY_BUFFER_ARB,VBO[1]);
     glNormalPointer(GL_FLOAT,SizeOf(TVector),nil);
     glDrawElements(GL_TRIANGLES,Length(Triangles)*3,GL_UNSIGNED_INT,nil);
     glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0);
     glDisableClientState(GL_VERTEX_ARRAY);
     glDisableClientState(GL_NORMAL_ARRAY);  
     glDisableVertexAttribArrayARB(ar);


    всё заработало. всем спасибо :)
  • Рома (09.07.08 12:55) [4]
    Молодец
  • SCRIMERS (20.08.08 19:17) [5]
    Вопрос, а что за ОГЛ такой, что команды glGenBuffersARB и все на *ARB имеются? Например у меня такие команды ни в одном заголовочном файле не имеется: ни в Глуте, ни даже в ОГЛ - та вообще нет нигде.

    Напишите мне пожалуйста объявления этих функций (ВБО) или где можно их вообще взять, или где можно взять "новый" заголовочный файл ОГЛ или ГЛУТ.

    Сразу говорю, что ресурсы типа www.mirgames.ru не катят, ибо читаю ту статью по VBO  я и пришел сюда.

    Я программирую на Делфи 6, стандартные библиотеки ГЛУТ и ОГЛ. Заранее Спасибо.
  • SCRIMERS (20.08.08 19:33) [6]
    всё разобрался сам- спасибо. ВСЕМ КТО НЕ ЗНАЕТ КАК ЭТО СДЕЛАТЬ ПРОШУ СЮДА http://pda.delphimaster.net/?id=1179836491&n=9
  • @!!ex © (20.08.08 21:57) [7]
    Класс. Люблю таких пользователей, которые задают вопрос, и сами на него отвечают. :)
    Кстати, без сарказма. Действительно хорошая привычка дать ответ на свой вопрос, подвести итог, чтобы следующий кто спросил мог погуглить и получить ответ.
  • SCRIMERS (23.08.08 00:34) [8]
    Теперь возник новый, последовательный вопрос, которого следовало ожидать)

    Введение:
     ДОпустим мне неообходимо отрендерить некую сцену, в которой куча разных объектов с разными цветами и текстурами.
      ====>> Закономерно, что я хочу сделать это с помощью VBO и за один батч (за один вызов-посылку отрисовку сцены)
       Вот с помощью VBO послал вершины, нормали, цвет и тд.
    Условия:
    ---Много объектов, которые рисуются по треугольникам (glDrawelements(..GL_Triangles...) допустим)
    --- РАзные текстуры (или текстура одна, но изображения разные на разных независимых объектах)

    Вопрос:
    1. А как же мне наложить текстуры на все эти объекты ? Хотелось бы за один присест, если возможно ?

     Вопрос-решение:
     1. (Скорее всего отпадает сам по себе) Возможно что тогда чередовать вызовы вершин и текстур в общем цикле ,но это будет напоминать glBegin... Glend, что не есть хорошо и выигрышным будет только в случае, если объект будет насчитывать >200 полигонов и все они будут использовать одну текстуру - это идилия.
    2. Использовать большую текстуру с альфа-каналом и работать с текстурными координатами объектов.

    Заключение: мне самому нравится второй вариант, но я его еще не опробовал.

    Подскажите, может кто с этаким сталкивался?

    П.З. Я канеш не настаиваю, но хотелось бы столь же последовательный ответ :)
  • SCRIMERS (23.08.08 00:34) [9]
    Теперь возник новый, последовательный вопрос, которого следовало ожидать)

    Введение:
     ДОпустим мне неообходимо отрендерить некую сцену, в которой куча разных объектов с разными цветами и текстурами.
      ====>> Закономерно, что я хочу сделать это с помощью VBO и за один батч (за один вызов-посылку отрисовку сцены)
       Вот с помощью VBO послал вершины, нормали, цвет и тд.
    Условия:
    ---Много объектов, которые рисуются по треугольникам (glDrawelements(..GL_Triangles...) допустим)
    --- РАзные текстуры (или текстура одна, но изображения разные на разных независимых объектах)

    Вопрос:
    1. А как же мне наложить текстуры на все эти объекты ? Хотелось бы за один присест, если возможно ?

     Вопрос-решение:
     1. (Скорее всего отпадает сам по себе) Возможно что тогда чередовать вызовы вершин и текстур в общем цикле ,но это будет напоминать glBegin... Glend, что не есть хорошо и выигрышным будет только в случае, если объект будет насчитывать >200 полигонов и все они будут использовать одну текстуру - это идилия.
    2. Использовать большую текстуру с альфа-каналом и работать с текстурными координатами объектов.

    Заключение: мне самому нравится второй вариант, но я его еще не опробовал.

    Подскажите, может кто с этаким сталкивался?

    П.З. Я канеш не настаиваю, но хотелось бы столь же последовательный ответ :)
  • @!!ex © (23.08.08 08:47) [10]
    Все хотят все рендерить за один батч. :)
    Но это невозможно и не шибко нужно.
    Для решения таких пробле и придумали сортировку по материалам.
  • DeadMeat (23.08.08 10:32) [11]
    Это очень даже возможно.... а иногда и очень нужно. Но в разумных пределах и все зависит от задачи. А может здесь это не надо?
    Если юзать новые фичи, то Texture Array и Bindable Uniform (кажется так пишется) + GLSL. Но это из новых.
    Старыми - чисто GLSL. Правда при всем при этом возможности использования уникальных шейдеров для объектов сокращаются.
    Т.е. за один проход можно будет отрисовать только однотипные (не одинаковые) объекты (допустим с одним видом освещения.. одним "видом бампа" и т.п.). Количество текстур конечно не велико, но допустим в разумных пределах - можно.
  • @!!ex © (23.08.08 10:37) [12]
    > [11] DeadMeat   (23.08.08 10:32)

    Конечно никто не мешает запихать в шейдер кучу текстур на все объекты в буффере и для вершины прописывать ID текстуры. Но это скорее минусы и геморой принесет, чем реальную пользу.
 
Конференция "Игры" » glVertexAttribPointerARB [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0][p:0.004]