Я ' 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);
}
и то же самое с униформами, запрашивает только активный Материал и глобальные объекты.