Как нарисовать треугольник со своей текстурой на каждом углу?

По сути, я хочу дать 3 текстуры для каждого угла треугольника и интерполировать от одной текстуры к другой, точно так же, как цвета будут интерполироваться с помощью glColor() на углах.

Редактировать: Поскольку это не представляется возможным с помощью объединителей текстур, я готов сделать это с помощью шейдеров.

Это код фрагментного шейдера, который у меня есть сейчас:

vec4 c = gl_Color;
gl_FragColor = texture2D(Texture0, TexCoord0)*c.r+texture2D(Texture1, TexCoord1)*c.g+texture2D(Texture2, TexCoord2)*c.b;

Я использую glColor(); чтобы подтолкнуть цвета (1,0,0), (0,1,0), (0,0,1) к углам каждого треугольника, а затем я читаю цвет, чтобы увидеть, сколько текстуры мне нужно смешать соответственно .

Теперь проблема в том, что я больше не могу использовать цвета на своих вершинах, поэтому я спрашиваю, как лучше всего сказать моему фрагментному шейдеру, как смешивать текстуры + иметь возможность использовать glColor() на каждом углу треугольника, чтобы применить некоторые раскраска?

Edit2: мне удалось заставить его работать, отправив 3D texcoord, который сообщает коэффициенты смешивания, но это лучший подход? Я хотел бы услышать больше идей по этому поводу.


person Rookie    schedule 08.08.2011    source источник


Ответы (1)


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

Однако, возможно, это возможно с двумя текстурами, используя альфа-смешивание (выбирая альфа-значение из цвета вершины) на второй текстуре. но я не уверен.

person neodelphi    schedule 08.08.2011
comment
да, я подумал о том, чтобы нарисовать 3 треугольника поверх каждого: первый сплошной, затем два остальных с противоположными цветами углов с нулевой альфой. но для рисования потребуется в 3 раза больше пикселей, поэтому это может стать очень медленным ... также проблема с этим подходом заключается в том, что я не могу использовать четвертую текстуру на них, или я мог бы, но тогда мне нужно нарисовать ее на ВСЕХ из 3 треугольников, что приводит к 6-кратному замедлению рендеринга. - person Rookie; 08.08.2011
comment
Я не это имел в виду. Использование двух текстур с одним треугольником, а не с двумя треугольниками, но я никогда не делал мультитекстурирование без шейдеров - не знаю, возможно ли это. Просто вопрос: почему нельзя использовать шейдеры? Вы разрабатываете на встроенной платформе? - person neodelphi; 08.08.2011
comment
я хочу предоставить версию без шейдеров, так как это будет основная часть игровой графики, поэтому, если шейдеры недоступны, игра все равно будет выглядеть сносно. - person Rookie; 08.08.2011
comment
Хорошо я понял. Лично я решил всегда использовать шейдеры, поскольку для поддержки старых графических карт или экзотических платформ требуется много разработки. - person neodelphi; 08.08.2011
comment
Мне удалось сделать для него шейдер, но есть некоторые проблемы. Я даю каждой вершине цвета (1,0,0), (0,1,0), (0,0,1). затем я делаю: gl_FragColor = tex1*r+tex2*g+tex3*b, но проблема в том, что теперь я вообще не могу использовать glColor для своих вершин. Есть ли другой способ имитировать механику glColor, чтобы он смешивал значения между вершинами? Или, возможно, какой-нибудь лучший метод смешивания значений между углами, чтобы получить интенсивность каждой текстуры? - person Rookie; 09.08.2011
comment
@Rookie: это не форум. Если у вас есть новый вопрос, создайте новый вопрос. - person Nicol Bolas; 09.08.2011
comment
@Nicol, это все тот же вопрос ... я мог бы отредактировать свой вопрос, так как я думаю, что должен делать это с помощью шейдеров. - person Rookie; 09.08.2011
comment
Вы не должны использовать немедленный режим с шейдерами для того, что вы хотите сделать. Вместо этого используйте объекты массива вершин и объекты буфера вершин - это позволит вам полностью контролировать свойства вершины (например, если вы хотите, вы можете назначить два цвета на вершину или цвет с 6 компонентами...). Обратите внимание, что это современные методы - возможно, есть другой способ сделать это, совместимый со старым оборудованием. - person neodelphi; 11.08.2011
comment
тогда как мне назначить два цвета на вершину? glVertexAttr() ? они будут интерполированы для каждой вершины? o.O - кстати, я знаю VBO и использую их, я сказал только glColor, чтобы вы понимали, какими должны быть его результаты. - person Rookie; 11.08.2011
comment
Функция glBufferData позволяет указать размер в памяти одной вершины. Затем glEnableVertexAttribArray и glVertexAttribPointer помогут вам настроить, какие байты вершины относятся к какому вводу шейдера. В шейдере вы можете использовать пользовательские атрибуты вершин для цвета вместо gl_Color. - person neodelphi; 12.08.2011
comment
так что glattribute будет масштабироваться как цвет, вот что я хотел услышать. - person Rookie; 12.08.2011
comment
В современном OpenGl нет концепции положения или цвета, все, что вы даете шейдерам, — это векторы с плавающей запятой. Вы можете дать столько, сколько хотите (конечно, до аппаратного предела), и определить их функциональность. Вот почему у вас может быть три цвета на вершину. Возможно, три альфа-компонента могут быть лучшими для производительности, если вы хотите одинаковую RGB для всех текстур — решать вам. - person neodelphi; 12.08.2011