Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Странная работа хардварного шейдера в gzdoom
   Список разделов - Местечко мапперов и моддеров - Странная работа хардварного шейдера в gzdoomОтветить
АвторСообщение
qwe8013
= Corporal =
Next rank: - Lance Corporal - after 14 points
116

Doom Rate: 1.93

Posts quality: +41
Ссылка на пост №1 Отправлено: 04.02.24 04:29:16
Здравствуйте! Захотелось мне тут при помощи шейдера нарисовать шум Перлина на стене, использую gzdoom, формат карты -- UDMF. И всё работает, но с небольшой оговоркой, в игре шум отображается следующим образом (смотрим слева на чёрный квадрат с белым дымом):

Сразу видно, что по неизвестной причине много дыма снизу и мало сверху. В принципе можно было бы сказать, что так рандом распорядился, но при включении меню мы видим следующую картину:

Как я понял, по неясной причине, точки с яркостью меньшей заданной в игре не отображаются, тогда как при включении меню они отображаются все.
Карту прикрепляю здесь (если я всё правильно сделал):
Ссылка
Шейдер дублирую ниже (там код конечно не самый производительный, но в процессе написания этого не требовалось)
Скрытый текст:


uniform float timer;

#define PI 3.1415926535897932384626433832795028841971693993751f

float part_rnd(float q)
{
	return fract(10.0f*q);
}

float random(float seed)
{
	float q = part_rnd(seed);
	q = part_rnd(q);
	q = part_rnd(q);
	q = part_rnd(q);
	q = part_rnd(q);
	return part_rnd(q);
}

vec2 random_normed_vector(vec2 seed)
{
	float phi = random(sin(dot(seed, vec2(0.46f, 0.24f))))*2.0f*PI;
	return vec2(cos(phi), sin(phi));
}

float bilinear(float base, float x, float y, float xy, vec2 offset)
{
	float a = base*(1.0f - offset.x)*(1.0f - offset.y);
	float b = x*offset.x*(1.0f - offset.y);
	float c = y*offset.y*(1.0f - offset.x);
	float d = xy*offset.x*offset.y;
	return a + b + c + d;
}

float noise_general(vec2 x, float octave_factor)
{
	vec2 transformed_coord = (x - trunc(x))*octave_factor;

	vec2 int_coord = trunc(transformed_coord);
	vec2 local_coord = transformed_coord - int_coord;

	vec2 zero_factor = vec2(1.0f) - step(octave_factor - 1.0f, int_coord);

	vec2 v00 = random_normed_vector(int_coord);
	vec2 v10 = random_normed_vector((int_coord + vec2(1.0f, 0.0f))*vec2(zero_factor.x, 1.0f));
	vec2 v01 = random_normed_vector((int_coord + vec2(0.0f, 1.0f))*vec2(1.0f, zero_factor.y));
	vec2 v11 = random_normed_vector((int_coord + vec2(1.0f, 1.0f))*zero_factor);

	float proj00 = dot(v00, local_coord);
	float proj10 = dot(v10, local_coord - vec2(1.0f, 0.0f));
	float proj01 = dot(v01, local_coord - vec2(0.0f, 1.0f));
	float proj11 = dot(v11, local_coord - vec2(1.0f, 1.0f));

	float result = bilinear(proj00, proj10, proj01, proj11, local_coord);
	/*vec2 u = smoothstep(0.0f, 1.0f, local_coord);//interpolation_coord

	float s0 = mix(proj00, proj10, u.x);
	float s1 = mix(proj01, proj11, u.x);

	float result = mix(s0, s1, u.y);*/

	return result;
}

#define NUM_OCTAVES 7
#define WEIGHT_EXPONENT_BASE 2.0f
#define WEIGHT_INV_EXPONENT_BASE (1.0f/WEIGHT_EXPONENT_BASE)

float noise(vec2 x)
{
	float result = 0.0f;

	float weight_sum = 0.0f;
	float weight = WEIGHT_INV_EXPONENT_BASE;
	float octave_param = 2.0f;
	for(uint i = 0; i < NUM_OCTAVES; i++)
	{
		result += noise_general(x, octave_param)*weight;

		weight_sum += weight;
		octave_param *= 2.0f;
		weight *= WEIGHT_INV_EXPONENT_BASE;
	}

	return result/weight_sum;
}

vec4 Process(vec4 color)
{
	vec2 texCoord = gl_TexCoord[0].st/* + vec2(timer/2.0f, 0.0f)*/;
	float n = noise(texCoord);
	return vec4(vec3(n) + vec3(0.0f), 0.0f);
}

JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 140 points
1300

Doom Rate: 2.28

Posts quality: +701
Ссылка на пост №2 Отправлено: 04.02.24 14:35:22
Посмотри настройки контрастности ("Options" → "Display Options" → "Contrast"). Не выше 1.0?

Скрытый текст:

2 7 1
qwe8013
= Corporal =
Next rank: - Lance Corporal - after 14 points
116

Doom Rate: 1.93

Posts quality: +41
Ссылка на пост №3 Отправлено: 04.02.24 18:14:36
JSO x
Контрастность в точности 1.0 её можно сделать конечно меньше и в таком случае "дым" лучше видно, но при этом общая картинка в игре становится вырвиглазной.
Страница 1 из 1Перейти наверх
   Список разделов - Местечко мапперов и моддеров - Странная работа хардварного шейдера в gzdoom