forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   OpenGL (http://forum.boolean.name/forumdisplay.php?f=63)
-   -   Вершинный буфер, создание и опирации с ним (WebGL) (http://forum.boolean.name/showthread.php?t=14817)

ІГРОГРАЙКО 31.05.2011 21:12

Вершинный буфер, создание и опирации с ним (WebGL)
 
Добрый день!

Я недавно начал познавать WebGL и у меня накопилось несколько вопросов.
Есть стандартная процедура заполнения веринного буфера на WebGL:
PHP код:

var squareVertexPositionBuffer;      //JavaScript объект для буффера
    
function initBuffers() {
        
squareVertexPositionBuffer gl.createBuffer();   //создание буффера
        
gl.bindBuffer(gl.ARRAY_BUFFERsquareVertexPositionBuffer);

        
//создание массива вершын
        
vertices = [
             
1.0,  1.0,  0.0,
            -
1.0,  1.0,  0.0,
             
1.0, -1.0,  0.0,
            -
1.0, -1.0,  0.0
        
];
        
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);    //Заполнение буффера
        //Дополнитильные переменные объекта
        
squareVertexPositionBuffer.itemSize 3;
        
squareVertexPositionBuffer.numItems 4;
    } 

Ета функция создает квадрат и вносит его в память...
Дале отрисовка етого же квадратика:
PHP код:

function drawScene() {
        
gl.viewport(00gl.viewportWidthgl.viewportHeight);
        
gl.clear(gl.COLOR_BUFFER_BIT gl.DEPTH_BUFFER_BIT);

        
mat4.perspective(45gl.viewportWidth gl.viewportHeight0.1100.0pMatrix);    //Установка перспективы обзора
        
mat4.identity(mvMatrix);   //Чёто делают с model view матрицей

        
gl.bindBuffer(gl.ARRAY_BUFFERsquareVertexPositionBuffer);
        
//Загрузка вершынного буфера в шейдерную програму
        
gl.vertexAttribPointer(shaderProgram.vertexPositionAttributesquareVertexPositionBuffer.itemSizegl.FLOATfalse00);
        
setMatrixUniforms();   //Обновления всех матриц
        
gl.drawArrays(gl.TRIANGLE_STRIP0squareVertexPositionBuffer.numItems);     //Рисование нашего вершынного буфера
    


Постановка задачи:
Требуетса создать оч большое количество квадратиков не связаных между собой (квад) с возможностю трансформировать, а точнее вращать каждый квадратик относительно положения камеры (то есть спрайты)...
А вот вопросы будут состоять в следующем:
  1. Возможно ли создать все ето большое количество квадов в одном вершинном буфере?
  2. Будит ли потом возможнось вращать отдельный квад относительно камеры?
  3. Сильна ли будет разница в быстроте отрисовки большого количества квадов между однобуферной и многобуферной реализацией?
Пока что ето все...

P.S. Вопросиы мои возможно немного тупые, но ответ на них может дать только хорошый спец по графике...

ffinder 01.06.2011 13:08

Ответ: Вершинный буфер, создание и опирации с ним (WebGL)
 
Цитата:

Сообщение от ІГРОГРАЙКО (Сообщение 190004)
Требуетса создать оч большое количество квадратиков не связаных между собой (квад) с возможностю трансформировать, а точнее вращать каждый квадратик относительно положения камеры (то есть спрайты)...
А вот вопросы будут состоять в следующем:
  1. Возможно ли создать все ето большое количество квадов в одном вершинном буфере?
  2. Будит ли потом возможнось вращать отдельный квад относительно камеры?
  3. Сильна ли будет разница в быстроте отрисовки большого количества квадов между однобуферной и многобуферной реализацией?

опыта с WebGL нету, но на С++, Unity и Blitz3d такой подход срабатывал.
ответы:
1. да, один вершинный буфер предпочтительней. техника называется batching.
2. да, если заполнять вершинный буфер каждый кадр заново. это не так дорого, как кажется на первый взгляд.
3. разница должна быть очень большой. современные видеокарты и драйвера для них расчитаны на отрисовку нескольких тысяч треугольников за один draw call. рисовать по два треугольника за дип - это пустая трата электроэнергии.


Часовой пояс GMT +4, время: 07:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot