Это не то, что Вы "Блокируете", это - код, это содержится между блокировкой {...} Это важно и что Вы препятствуете быть выполненными.
, Если один поток вынимает блокировку () на каком-либо объекте, он препятствует тому, чтобы другие потоки получили блокировку на том же объекте, и следовательно препятствует тому, чтобы второй поток выполнил код между фигурными скобками.
Так вот почему большинство людей просто создает объект спама соединиться, он препятствует тому, чтобы другие потоки получили блокировку на том же самом объекте спама.
Недавно я написал небольшой движок рендеринга ландшафта в OpenGL, который делает нечто похожее на то, о чем вы говорите. Технику, которую я использую, лучше всего описать как разделение текстур .
Я использую пять текстур для этого. Четыре из этих текстур являются текстурами деталей: трава, камень, вода и песок. Эти текстуры небольшие, 512x512, и они выложены плиткой по ландшафту. Пятая текстура - это микс-карта. Mixmap - это гигантская текстура, покрывающая всю местность, в моем случае это 4096x4096.
Эта карта микширования использует все 4 цветовых канала (r, g, b, a) для описания того, какая часть текстуры деталей должна отображаться в этом конкретном месте. Я использую канал красного цвета, чтобы определить, насколько непрозрачен песок, зеленый - для травы, синий - для воды, а альфа - для камня. Эта карта микширования рассчитывается на основе карты высот при инициализации, и я использую высоты для определения этих значений. Например, ближе к уровню моря мне больше всего нужна вода, поэтому я установил высокое значение в синем канале и низкие значения в других каналах. Когда я поднимаюсь выше в горы, я устанавливаю альфа-канал цвета на высокое значение, так как мне нужно много текстуры камня, но я устанавливаю все другие цветовые каналы на более низкие значения.
Эта карта микширования затем используется во фрагментном шейдере, где я беру эти цветовые каналы на карте микширования и использую их для объединения текстур деталей. Вот код GLSL, который я использую для фрагментного шейдера:
uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;
varying vec3 normal, lightDir ;
void main()
{
// Get the color information
vec3 alpha = texture2D( alpha, gl_TexCoord[0].st ).rgb;
vec3 texSand = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
vec3 texGrass = texture2D( grass, gl_TexCoord[0].st * texscale ).rgb;
vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
vec3 texRock = texture2D( rock, gl_TexCoord[0].st * texscale ).rgb;
// Mix the colors together
texSand *= mixmap.r;
texGrass = mix(texSand, texGrass, mixmap.g);
texWater = mix(texGrass, texWater, mixmap.b);
vec3 tx = mix(texWater, texRock, mixmap.a);
// Lighting calculations
vec3 dl = gl_LightSource[0].diffuse.rgb;
vec3 al = gl_LightSource[0].ambient.rgb;
vec3 n = normalize(normal);
vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );
// Apply the lighting to the final color
vec4 finalColor = vec4( min(d, 1.0), 1.0);
gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}
Единый текстовый масштаб - это значение, которое определяет, сколько раз текстуры деталей накладываются друг на друга по местности.
ID, похоже, заставил одну большую «мегатекстуру» (мы говорим о 32K ^ 2-128K ^ 2) работать в QuakeWars.
Там есть интересный Вопросы и ответы Кармака об этом на
http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2
(исходная ссылка в настоящее время кажется мертвой, но это не делает приведенную выше ссылку, потому что у SO, похоже, есть проблемы со ссылками на Интернет-архив; они хорошо выглядят в предварительном просмотре редактирования, затем прерываются на главной странице) .
вы не можете убежать от тайлинга, но, возможно, если вы используете базовая текстура, которая создает небольшой шум на земле, похоже, что нет мозаики ...
используйте базовую текстуру с теми же координатами текстуры альфа-текстуры. Базовая текстура может быть любой .. спутниковое изображение или текстура травы .. он идеально подошел бы, если бы он соответствовал вашей форме земли ..
и попробуйте использовать бесшовные текстуры для травы, текстуры камней ... он не решает, но делает вид, что проблемы нет
Обычно переходные области создаются заранее, хотя некоторые вещи можно делать с альфа-каналами и смешиванием текстур.
предварительная выпечка определенно не является неэффективной. Фактически, он наиболее эффективен, потому что вашему рабочему коду не нужно выполнять какие-либо смешивания или другие вычисления. он просто отображает текстуру. Конечно, динамические методы предлагают упрощение цепочки инструментов и больше возможностей.
Фактически, наиболее эффективен, потому что вашему рабочему коду не нужно выполнять какое-либо смешивание или другие вычисления. он просто отображает текстуру. Конечно, динамические методы предлагают упрощение цепочки инструментов и больше возможностей. Фактически, наиболее эффективен, потому что вашему рабочему коду не нужно выполнять какое-либо смешивание или другие вычисления. он просто отображает текстуру. Конечно, динамические методы предлагают упрощение цепочки инструментов и больше возможностей.