Отображение атрибутов вершинного шейдера в GLSL

Я ' m кодирует небольшой механизм рендеринга с помощью шейдеров GLSL:

Каждая сетка (ну, субсетка) имеет несколько потоков вершин (например, положение, нормаль, текстура, касательная и т.д.) в один большой VBO и MaterialID.

Каждый Материал имеет набор текстур и свойств (например, specular-color, diffuse-color, color-texture, normal-map и т.д.)

Затем у меня есть шейдер GLSL с его формами и атрибутами. Скажем:

uniform vec3 DiffuseColor;
uniform sampler2D NormalMapTexture;
attribute vec3 Position;
attribute vec2 TexCoord;

Я немного застрял в попытке спроектировать способ для шейдера GLSL определять сопоставления потоков (семантику) для атрибутов и униформ, а затем связывать потоки вершин с соответствующими атрибутами.

Что-то в строках, говорящих мешу: «поместите поток позиции в атрибут« Position », а ваши координаты текс в« TexCoord ». Также поместите диффузный цвет вашего материала в« DiffuseColor » и вторая текстура вашего материала в "NormalMapTexture"

В настоящий момент я использую жестко запрограммированные имена для атрибутов (например, позиция вершины всегда "Позиция" и т. д.) и проверяю каждую форму и имя атрибута, чтобы понять, что шейдер использует его для.

Думаю, я ищу какой-нибудь способ создания «объявления вершин», но включая также униформу и текстуры.

Мне просто интересно, как люди делают это в крупномасштабных механизмах рендеринга.

Редактировать:

Резюме предлагаемых методов:

1. Атрибут / Единая семантика задается именем переменной и т.д.) и проверяя каждую форму и имя атрибута, чтобы понять, для чего шейдер ее использует.

Думаю, я ищу какой-то способ создания «объявления вершины», но включая также униформу и текстуры.

Мне просто интересно, как люди делают это в крупномасштабных механизмах рендеринга.

Редактировать:

Резюме предлагаемых методов:

1. Атрибут / Единая семантика задается именем переменной и т.д.) и проверяя каждую форму и имя атрибута, чтобы понять, для чего шейдер ее использует.

Думаю, я ищу какой-то способ создания «объявления вершины», но включая также униформу и текстуры.

Мне просто интересно, как люди делают это в крупномасштабных механизмах рендеринга.

Редактировать:

Резюме предлагаемых методов:

1. Атрибут / Единая семантика задается именем переменной (что я делаю сейчас) Использование предопределенных имен для каждого возможного атрибута. Связывающее устройство GLSL запросит имя для каждого атрибута и свяжет массив вершин на основе имени переменной:

//global static variable

semantics (name,normalize,offset) = {"Position",false,0} {"Normal",true,1},{"TextureUV,false,2}

 ...when linking
for (int index=0;index<allAttribs;index++)
{
   glGetActiveAttrib(program,index,bufSize,length,size[index],type[index],name);      
   semantics[index]= GetSemanticsFromGlobalHardCodedList(name);
} 
... when binding vertex arrays for render
 for (int index=0;index<allAttribs;index++)
{
    glVertexAttribPointer(index,size[index],type[index],semantics[index]->normalized,bufferStride,semantics[index]->offset);

}  

2. Предопределенные местоположения для каждого семантического

связывателя GLSL всегда будут связывать массивы вершин с одними и теми же местоположениями. Задача шейдера - использовать соответствующие имена для сопоставления. (Это кажется ужасно похожим на метод 1, но если я не неправильно понял, это подразумевает привязку ВСЕХ доступных данных вершин, даже если шейдер не использует их)

.. when linking the program...
glBindAttribLocation(prog, 0, "mg_Position");
glBindAttribLocation(prog, 1, "mg_Color");
glBindAttribLocation(prog, 2, "mg_Normal");

3. Словарь доступных атрибутов из материалов, глобальных объектов движка, средства визуализации и сетки

Ведение списка доступных атрибутов, опубликованных активным материалом, глобальными объектами механизма, текущим средством визуализации и текущим узлом сцены.

например:

 Material has (uniformName,value) =  {"ambientColor", (1.0,1.0,1.0)}, {"diffuseColor",(0.2,0.2,0.2)}
 Mesh has (attributeName,offset) = {"Position",0,},{"Normals",1},{"BumpBlendUV",2}

затем в шейдере:

 uniform vec3 ambientColor,diffuseColo;
 attribute vec3 Position;

При привязке данных вершины к шейдеру, связыватель GLSL будет перебирать атрибуты и привязываться к тому, который найден (или нет?) в словаре:

 for (int index=0;index<allAttribs;index++)
    {
       glGetActiveAttrib(program,index,bufSize,length,size[index],type[index],name);      
      semantics[index] = Mesh->GetAttributeSemantics(name);
}

и то же самое с униформами, запрашивает только активный Материал и глобальные объекты.

37
задан Radu094 8 February 2011 в 16:13
поделиться