2013-09-17 3 views
2

Чтобы объяснить эту проблему простым способом, представьте себе три плитки 16x16: один полный песок, одна полная трава и один переход из песка и травы.Смешивающие текстуры Libgdx на основе определенных цветов?

После создания карты я хотел бы наложить на эти плитки более крупный узор, чтобы они не выглядели так повторяющимися. Мое текущее решение, например, состоит в том, чтобы иметь большой повторяющийся рисунок песка размером 64x64, и каждый раз, когда я вижу песчаную черепицу, я посмотрю, в какой строке и столбце ее, а вместо этого используйте соответствующий кусок размером 16x16 из 64x64 плит. Таким образом, более крупный рисунок используется в целом, и песок выглядит красиво (тот же для травы).

Проблема связана с переходными плитами, которые могут быть наполовину песочными, наполовину травяными. Я хотел бы иметь возможность наложить половину переходной плитки с рисунком песка, а вторую половину - на узор травы. Есть ли способ объявить половину плитки прозрачной и наложить что-то поверх нее, а затем объявить другую половину прозрачной и наложить на нее что-то еще? Очевидно, что должны быть два отдельных альфа-канала - может ли он смешиваться с определенной базой пикселей? Смысл я объявляю, что зеленый пиксель будет прозрачным для участков травы, а желтый пиксель будет прозрачным для участков песка?

Я не знаю, как это сделать в libgdx, если это даже возможно, поэтому любая помощь по коду будет оценена по достоинству.

ответ

2

Вы должны определенно рассмотреть возможность использования шейдеров в libgdx.

Если вы используете шейдеры, вы можете передать несколько текстур в fragmentshader одновременно: например, трава, песок и текстура для смешивания ч/б, сделанные/рассчитанные для правильного смешивания. Ваш fragmentshader может решить, какая текстура (трава или песок) используется для вычисления фрагментарного цвета (или и того и другого). Вашего код fragmentshader может выглядеть следующим образом:

void main() { 
    float alpha = texture2D(u_yourBlendingTexture, v_yourTerrainTexCoords); 
    gl_FragColor = texture2D(u_yourGrassTexture, v_yourTerrainTexCoords) * alpha + texture2D(u_yourSandTexture, v_yourTerrainTexCoords) * (1.0 - alpha); 
} 

Альтернатива:

void main() { 
    float alpha = texture2D(u_yourBlendingTexture, v_yourTerrainTexCoords); 
    gl_FragColor = mix(texture2D(u_yourGrassTexture, v_yourTerrainTexCoords), texture2D(u_yourSandTexture, v_yourTerrainTexCoords), alpha); 
} 

Это не очень оптимизировано, особенно, когда вы связывание нескольких текстур в то же время это может замедлить вашу программку/приложение.

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