2013-11-15 2 views
2

Я работаю над пакетным рендерингом WebGL (вопрос по-прежнему действителен в среде OpenGL). Aka вся графика в сцене, нарисованная в наименьших возможных вызовах drawArrays/drawElements (в идеале 1). Часть этого предполагает возможность определения текстур на основе атрибутов.Текстуры партийного рисования WebGL. У кого лучшая производительность и почему?

Поэтому в моем пиксельный шейдер я созерцая два сценария:

1. Розыгрыш текстуры 0 к экрану и использования атрибутов для определения «рамку», в котором текстура лежит на спрайт листа, которая находится в Память. Пиксельный шейдер будет выглядеть примерно так:

precision mediump float; 

uniform sampler2D u_spriteSheet; 

// Represents position that's framed. 
varying vec4 v_texturePosition; 

void main() { 
    gl_FragColor = texture2D(u_spriteSheet, v_texturePosition); 
} 

2. ли «если» заявление в затенении, чтобы определить, какой равномерную sampler2D использовать. Пиксельный шейдер будет выглядеть примерно так:

precision mediump float; 

uniform sampler2D u_image1; 
uniform sampler2D u_image2; 
uniform sampler2D u_image3; 
uniform sampler2D u_image4; 
.... 
uniform sampler2D u_image32; 

varying uint v_imageId; 
// Represents texture position that's framed 
varying vec4 v_texturePosition; 

void main() { 
    if(v_imageId == 1) { 
     gl_FragColor = texture2D(u_image1, v_texturePosition); 
    } 
    else if (v_imageId == 2) { 
     gl_FragColor = texture2D(u_image2, v_texturePosition); 
    } 
    ... 
    else if (v_imageId == 32) { 
     gl_FragColor = texture2D(u_image32, v_texturePosition); 
    } 
} 

Я понимаю, что с опцией 1 Я ограничен максимальным размером текстуры и подходом 2 я ограничен числом регистров текстур доступны. Ради обсуждения давайте предположим, что эти пределы никогда не будут переданы.

Я пытаюсь определить более эффективный подход, прежде чем вкладывать значительное количество времени в один из них ... Sooo какие-то мысли?

+0

Имеет ли текстуры опцию? – Raxvan

+0

Извините, не знакомы с жаргоном, atased? –

+0

Текстурный атлас - более общий термин для того, что вы называете листом спрайта. – rickster

ответ

4

Если утверждения в шейдерах обычно медленные, поскольку на обычном аппаратном обеспечении GPU шейдеры выполняются как SIMD, то есть многие фрагменты обрабатываются параллельно, инструкция по инструкции. Упрощенная речь, в случае если все потоки обрабатывают тогда часть, в которой только потоки с положительным if-condition действительно выполняют и сохраняют результат, пока другие потоки ждут (или даже выполняют расчет, но не сохраняют результат) , Впоследствии все потоки выполняют часть else, и все потоки с положительным условием ждут.

Так что в вашем растворе # 2 пиксельный шейдер на многих картах будет выполнять все 32 частей, а не только один, как в растворе №1 (На некоторых картах он сказал, что они прекращают выполнение если ветвь, если нет нить после этой части больше, поэтому может быть меньше 32).

Итак, я ожидал бы, что решение # 1 будет быстрее w.r.t в шейдере фрагмента. Однако ваше решение может иметь другие узкие места, так что производительность шейдера фрагмента может стать неактуальной для общей производительности.

Дополнительные мысли о том, что многие графические процессоры позволяют использовать менее 32 текстур, поэтому вы, возможно, не можете использовать 32, если хотите оставаться совместимыми со многими устройствами. Согласно webglstats.com 99% имеют 16 блоков текстур, и поскольку большинство сцен имеют более 16 текстур, вероятно, нет пути вокруг , реализующего что-то вроде вашего решения # 1. С другой стороны, когда вы нажимаете максимальный размер текстуры, вам может понадобиться что-то вроде # 2.

+0

Удивительное прозрение, ты потрясающий! Последний вопрос, если дело доходит до того, что я должен делать заявления «если», это приведет к поражению производительности пакетного рендеринга? –

+0

^Хельмут, есть ли какая-нибудь победа, поставив пробоотборники в массив и используя в нем индекс? (Вместо text2d() в операторах if.) –

+0

@davidvanbrink Я бы с удовольствием это сделал. Я не думал, что вы могли бы наложить массив текстур на графическую карту. Как я мог это сделать? –

Смежные вопросы