Вот решение подсказали, а воспользоваться, походу, им не получится... Там для одинаковых, не смещённых текстур, а мне надо для смещённых... И желательно чтоб ещё и части текстур. :(
Есть какая-то возможность выбрать кусок текстуры и составить другую текстуру, не прибегая к каким-нибудь фреймбуферам?
... а может это и есть решение? Использовать фреймбуфер?!
Mirrel
> Вот решение подсказали, а воспользоваться, походу, им не получится... Там для одинаковых, не смещённых текстур, а мне надо для смещённых... И желательно чтоб ещё и части текстур. :(
>
> Есть какая-то возможность выбрать кусок текстуры и составить другую текстуру, не прибегая к каким-нибудь фреймбуферам?
> ... а может это и есть решение? Использовать фреймбуфер?!
Ты же хочешь сделать средствами Opengl, а значит средствами видеокарты. А это значит использовать нужно шейдеры или фреймбуферы. Но я сомневаюсь, что только фоеймбуферами без шейдеров удастся смешать две текстуры.
Хотя может я и ошибаюсь, просто мое мнение.
Мне так кажется.
MikeNew, выше (1456) скинул решение. Проверю, отпишусь, работает или нет.
Если будет всё работать на устаревшем OpenGL, то с шейдерами проблем будет меньше. И там просто реализовать надо будет это решение.
Mirrel
> прозрачны, чёрные.
> Есть такое понятие, отсутствие цвета. Люди назвали это чёрным цветом, где нет ни какого цвета.
Тогда изъясняйся понятнее. Если ты имеешь в виду черный цвет пиксела, то так и говори.
«Отсутствие пикселей в текстуре» звучит как будто в текстуру не загружены данные, но ни как пиксели чёрного цвета
AMM1AK
> «Отсутствие пикселей в текстуре»
отсутствующие включенные пиксели - так подойдёт?
Выше выкладывал решение по работе с текстурами.
// подготавливаем цель 1, выводим текстуру в фреймуффер 0. rtarget_Set(pzTarTex1); one_texture_Draw(0, 0, _myFrame + 2, memRect); rtarget_Set(RT_NO_TARGET); // подготавливаем цель 2, выводим текстуру в фреймуффер 1. rtarget_Set(pzTarTex0); triple_texture_Draw(0, 0, _myFrame + 1, memRect, videoMem[$23c0]); rtarget_Set(RT_NO_TARGET); // дальше код ломает просто всю отрисовку. // пытаемся работу произвести с готовыми текстурами, которые переданы в текстуры выше. glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex_GetTextireID(rtarget_GetSurface(pzTarTex0))); // указываем что текстуру надо заменить glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // выираем следующую текстуру glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex_GetTextireID(rtarget_GetSurface(pzTarTex1))); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_SUBTRACT); // Modulate ALPHA with ALPHA glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
В общем данное решение, не то чтобы не работает, оно ломает всю отрисовку. Вся модуляция прицепляется ко всем текстурам. Кто-то знает решение?
P.S. мне надо после этого действия вывести текстуру которую получил и вернуть всю модуляцию в изначальное значение? Как отключить модуляцию?
Funtik
> на решения в твоей ссылке в виде шейдеров 2.0
The equivalent with GL 2.0 shaders
у тебя всё нормально?
Но по сути... предоставленное решение всё равно не лучше, если б я вручную всё делал...
Funtik, так и не догадался?
Ответ проще некуда. Мне просто нужно чтоб работало. А без шейдеров работать будет, значит и с шейдерами работать будет (неужели я этого уже не писал ранее?).
Funtik
> Ты слишком негативный и склочный
возможно. Но с тем как многие подходят к вопросу, приходится таким быть. И возможно виноват в этом не ты, но если мне память не изменяет, то ты так же участвовал в "травле" меня, по поводу и без (чаще без, возможно не про тебя, а про любителей хренью страдать и показывать себя выше других).
Funtik
> Правдоруб - Да!
правдоруб - это когда ты знаешь человека и говоришь правду ему в лицо.
Точно зная что это правда! )))
Меня ты не знаешь, ты не даже предполагать не можешь правды обо мне (только по стилю общения предполагать).
Ну в общем я нашёл решение и проблему... Можно просто вывести текстуру и вычесть из неё входящую текстуру.
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_SUBTRACT); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
Теперь проблема в том, что когда я запихиваю это решение в фреймбуфер, теряется прозрачность текстуры и всё становится непрозрачным.
Кто-то знает, как задать фреймбуферу, что фон у текстуры должен оставаться прозрачным?
Всё работает. Теперь спрайты можно резать. ))) Если не задать "GL_COMBINE_ALPHA", то ни чего вы не нарежете. Накладываемая текстура должна быть RGBA=$FFFFFF00. Тогда прозрачность накладываемого спрайта добавляется.
type
GLESPVertex = ^GLESTVertex;
GLESTVertex = record
U, V : Single;
X, Y : Single;
end;
TColor = record
R, G, B, A: Single;
end;
var
Vertices: array [0..17] of GLESTVertex;
VertColor: array [0..17] of TColor;
...
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 16, @Vertices[0].U);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, @VertColor[0]);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 16, @Vertices[0].X);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
...Что вообще может быть не так с этим кодом? В данном варианте, пропадает цвет.
Тут выводятся три текстуры с разным цветом, в одно место.
Мне что, обязательно надо вывести каждую текстуру отдельно? Чтоб можно было наложить вторую/третью не теряя цвет?
Отбой, сам же себе ответ написал... я текстуру менял когда данные передавал на прорисовку.
Mirrel
skalogryz
> chatgpt
он бы за меня рендер написал, который не будет тормозить на мобилках. )))
Mirrel
Тема в архиве.