Несколько изображений структуры, смешанных вместе на 3D землю

Это не то, что Вы "Блокируете", это - код, это содержится между блокировкой {...} Это важно и что Вы препятствуете быть выполненными.

, Если один поток вынимает блокировку () на каком-либо объекте, он препятствует тому, чтобы другие потоки получили блокировку на том же объекте, и следовательно препятствует тому, чтобы второй поток выполнил код между фигурными скобками.

Так вот почему большинство людей просто создает объект спама соединиться, он препятствует тому, чтобы другие потоки получили блокировку на том же самом объекте спама.

10
задан Ricket 10 July 2009 в 17:34
поделиться

5 ответов

Недавно я написал небольшой движок рендеринга ландшафта в OpenGL, который делает нечто похожее на то, о чем вы говорите. Технику, которую я использую, лучше всего описать как разделение текстур .

Я использую пять текстур для этого. Четыре из этих текстур являются текстурами деталей: трава, камень, вода и песок. Эти текстуры небольшие, 512x512, и они выложены плиткой по ландшафту. Пятая текстура - это микс-карта. Mixmap - это гигантская текстура, покрывающая всю местность, в моем случае это 4096x4096.

MixMap

Эта карта микширования использует все 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);
}

Единый текстовый масштаб - это значение, которое определяет, сколько раз текстуры деталей накладываются друг на друга по местности.

9
ответ дан 4 December 2019 в 00:26
поделиться

ID, похоже, заставил одну большую «мегатекстуру» (мы говорим о 32K ^ 2-128K ^ 2) работать в QuakeWars.

Там есть интересный Вопросы и ответы Кармака об этом на

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

(исходная ссылка в настоящее время кажется мертвой, но это не делает приведенную выше ссылку, потому что у SO, похоже, есть проблемы со ссылками на Интернет-архив; они хорошо выглядят в предварительном просмотре редактирования, затем прерываются на главной странице) .

1
ответ дан 4 December 2019 в 00:26
поделиться

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

используйте базовую текстуру с теми же координатами текстуры альфа-текстуры. Базовая текстура может быть любой .. спутниковое изображение или текстура травы .. он идеально подошел бы, если бы он соответствовал вашей форме земли ..

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

0
ответ дан 4 December 2019 в 00:26
поделиться

Обычно переходные области создаются заранее, хотя некоторые вещи можно делать с альфа-каналами и смешиванием текстур.

0
ответ дан 4 December 2019 в 00:26
поделиться

предварительная выпечка определенно не является неэффективной. Фактически, он наиболее эффективен, потому что вашему рабочему коду не нужно выполнять какие-либо смешивания или другие вычисления. он просто отображает текстуру. Конечно, динамические методы предлагают упрощение цепочки инструментов и больше возможностей.

Фактически, наиболее эффективен, потому что вашему рабочему коду не нужно выполнять какое-либо смешивание или другие вычисления. он просто отображает текстуру. Конечно, динамические методы предлагают упрощение цепочки инструментов и больше возможностей.

Фактически, наиболее эффективен, потому что вашему рабочему коду не нужно выполнять какое-либо смешивание или другие вычисления. он просто отображает текстуру. Конечно, динамические методы предлагают упрощение цепочки инструментов и больше возможностей.

1
ответ дан 4 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: