OpenGL ES - Промяна на нюанса на цветовете в текстурата

Разработвам проста 2D-игра в OpenGL ES за iPhone. Проблемът ми е, че искам да изобразя текстура, използвайки различни нюанси. По принцип искам да променя нюанса на цветовете в текстурата, която изобразявам. Простата промяна на glColor няма да свърши работа, тъй като засяга и частите на изображението без цвят. Някакви идеи?


person Jens Utbult    schedule 13.10.2009    source източник
comment
можете ли да изясните защо смятате, че glColor няма да работи? Какво имаш предвид, засяга и частите от изображението без цвят   -  person Bahbar    schedule 13.10.2009
comment
Предполагам, че има бяла част от текстурата, която трябва да остане бяла, но след това има червена част от текстурата, която вместо това трябва да е зелена. В този случай--какво ще кажете за две отделни прозрачни текстури, една с частта, която не трябва да се променя, и една, която е, която можете да изобразите с различни настройки на glColor?   -  person David Maymudes    schedule 14.10.2009
comment
Дейвид е прав. Черните и сивите части също трябва да останат черни и сиви. Текстурите, които използвам, са предварително изобразени в 3D-програма с градиенти, преминаващи например от синьо към бяло, което затруднява разделянето им на две текстури.   -  person Jens Utbult    schedule 14.10.2009


Отговори (1)


Благодаря за разяснението, беше далеч от първоначалното ми разбиране. Имайте предвид, че текстурата, която предоставяте на OpenGL ES, вече има нюанс, така че това, което искате, е да промените съществуващия нюанс.

Първо, позволете ми да отговоря на зададения въпрос:

Нека започнем с това какво трябва да се случи с текселите. Тъй като OpenGL текстурите се съхраняват като RGB, за да трансформирате нюанса на тексел, трябва да отидете RGB->HSL->приложи нов нюанс->RGB. Можете да намерите действителната математика за извършване на RGB->HSL и обратно преобразуване тук. Как искате да изберете новия нюанс, предполагам, че ще трябва да го попълните.

Най-големият въпрос екогатрябва да се случи трансформацията. Е, конвейерът на OpenGL няма да ви позволи да направите толкова сложна трансформация при четене на текстура (все пак не в ES 1.1 - ES 2.0 fragment shaders ще помогне, но на висока цена). Така че ще трябва да направите всички трансформации извън конвейера за текстуриране на GL ES. В зависимост от това колко често трябва да променяте нюансите, моят съвет е или да го правите офлайн (и да съхранявате различни тематични текстури), или да изчислявате нови текстури за новите нюанси при поискване точно преди да ги заредите в OpenGL ES.

Доколкото знам, GL ES 1.1 няма никакво вградено средство, което да помогне за това директно.

Сега, като направя крачка назад, не съм сигурен какво ви пречи да разделите на 2 текстури, ако можете да живеете с 2-те текстури, които да приложите по време на изпълнение. Математиката, която посочих, отделя наситеността от лекотата, без значение как е генерирана текстурата (и на теория нюансът трябва да е постоянен, ако разбирам правилно вашия случай). Извършването на изчисленията офлайн трябва да е сравнително лесно за всяка входна текстура?

person Bahbar    schedule 18.10.2009