2014-12-27 3 views
0

У меня в основном есть две текстуры, одна база и один накладной. Мне нужно сделать два рисования обоих из них на новую текстуру.Нарисуйте две текстуры для новой текстуры в opengl

Таким образом, если текстура 1:

AAAAA 
BBBBB 
CCCCC 

и текстуры 2:

B 
B 
A 

тогда он должен вернуть:

ABAAA 
BBBBB 
CACCC 

кроме него было бы с реальными текстурами, а не письма.

(Примечание: пустые символы прозрачности, которые игнорируются)

UPDATE 1:

Я не могу использовать шейдеры, так как это в среде моддинга, и мне нужно, чтобы связать текстуру, чтобы быть нарисованный внешним рендерером. Имеет ли это смысл?

ОБНОВЛЕНИЕ 2:

альфа для второго изображения может быть любым. 0.0 или прозрачные средства ничего не делают с ним и используют 1-е изображение, в противном случае используют второе изображение

+0

Что вы ищете, это смешение https://www.opengl.org/wiki/Blending. В основном вы сначала рисуете квад с текстурой 1, а затем квадрат с текстурой 2, где цвет от текстуры 2 взвешен по альфа-значению. Поэтому, если значение альфа-сигнала из текстуры 2 равно 0, вы увидите текстуру 1, и если значение альфа-значения равно 1, чем вы видите текстуру 2. – dari

+1

Это выполнимо с помощью мультитекстурирования или шейдеров (но это не создаст ни одной выходной текстуры). Какую прозрачность использует текстура 2? Просто ** 0.0 ** и ** 1.0 **? _Вы объясните, почему их нужно объединить в одну текстуру в сравнении с одновременно применяемыми? _ –

ответ

0

Вы можете настроить FBO с полученной текстурой как вложение, а затем смешать две входные текстуры в шейдере фрагмента. Это всего лишь схема этапов:

  1. Создание и распределение текстуры результата.
  2. Создание и связывание FBO (glGenFramebuffers, glBindFramebuffer).
  3. Прикрепите текстуру результата к FBO.
  4. Привяжите две текстуры ввода к двум различным текстурным единицам.
  5. Привязать программу с фрагментарным шейдером, который отображает из двух текстур и смешивает их. Код GLSL может выглядеть примерно так:

    in vec2 TexCoord; 
    uniform sampler2D Texture1; 
    uniform sampler2D Texture2; 
    out FragColor; 
    void main() { 
        vec4 texVal1 = texture(Texture1, TexCoord); 
        vec4 texVal2 = texture(Texture2, TexCoord); 
        FragColor = mix(texVal2, texVal1, texVal2.a); 
    } 
    
  6. Выставьте атрибуты, формы и т.д.

  7. Рендер размер экрана четырехугольник.
+0

более подробные инструкции о том, как это сделать в чистом opengl – mincrmatt12

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