forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Имитация водной поверхности. (http://forum.boolean.name/showthread.php?t=15000)

Mr_F_ 17.08.2011 17:59

Ответ: Имитация водной поверхности.
 
используй occlusion queries. вроде бы они уже есть в ксорсе... спроси Сквида.

.Squid 17.08.2011 18:15

Ответ: Имитация водной поверхности.
 
OQ еще нет.
Дешевле рисовать вообще все квадратики, чем пытаться понять, видна вершина или нет. Тем более, используя для этого З-буфер о_О

dsd 18.08.2011 22:19

Ответ: Имитация зед-буфера.
 
Цитата:

Handle DepthBuffer = xCreateImage(600,400);
...
if (xKeyDown(42)) xDrawImage (0,0,DepthBuffer);
Чё оно падает?

Самый простой способ займеть буфер глубины для какого-то отдельного меша:
1.Наложить на меш шейдер, как в "первых шагах" только в пиксельном писать цветом расстояние от камеры до текущего пикселя.
2.Поставить xSetBuffer(mydepthbuffer);
3. xRenderEntity(myMesh);
4. xSetBuffer(BackBuffer());
5. Выключить шейдер.
Так?

Самый простой способ получить какой-то буфер. Отрендрить в картинку сцену с включенным xWireframe(true); Потом для спроецированных координат моей вершины читать картинку в соответсвующем месте и если пиксель не черный, значит можно рисовать квадратик?

Mr_F_ 18.08.2011 22:26

Ответ: Имитация водной поверхности.
 
Цитата:

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

Цитата:

Потом для спроецированных координат моей вершины читать картинку в соответсвующем месте и если пиксель не черный, значит можно рисовать квадратик?
НЕТ. гонять результат рендера в оперативку полусмертельно.
уже я говорил про OQ, а если их нет, то Сквид сказал что дешевле рисовать все точки.

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

dsd 18.08.2011 22:28

Ответ: Имитация водной поверхности.
 
Я какбэ не игру писать начал :) Подразумевается, что будет видно адин меш и фпс даже 15 будет вполне нормальным :)

Mr_F_ 18.08.2011 22:43

Ответ: Имитация водной поверхности.
 
я не знаю в каком приложении нужен искуственно пониженый чтением пикселей из текстур фпс ))

dsd 18.08.2011 22:46

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

ANDREYman 18.08.2011 23:03

Ответ: Имитация водной поверхности.
 
dsd,
А это не важно сколько пикселей ты читаешь, хоть все хоть два - текстура перегоняется целиком, от этого и тормоза.

dsd 18.08.2011 23:07

Ответ: Имитация водной поверхности.
 
Это все здорово, что оно лагать будет, лучше мне скажите че оно падает при xDrawImage() :(

А может можно в вершинном шейдере писать в цвет вершины флаг видимости точки? Или эти данные обратно в хорс не передадутся?


оффтоп: если в кодеблокс открыт xors3d.h, то функции хорса будут появлятся списком как в Visual Blitz. Не слишком очевидная зависимость :-D

p.s. На сфере с 32 чего там, выдает 130 фпс. Шмертельные лаги, я ф такой пичали :( а с 64 так вообсче 60 фпс всего. Чорт побери!!! А с 128 так вообще всего 40, этого мало что бы вертексами подрыгать мышкой :(((

dsd 19.08.2011 15:34

Ответ: Имитация водной поверхности.
 
При xCameraProject (camera,x1,y1,z1)
ProjectedX() - пишется x точки на экране
ProjectedY() - пишется y точки на экране
ProjectedZ() - пишется значение лежащее в (0,1)

Из непроверенных источников мне стало известно, что и z-buffer имеет значение в подозрительно похожем интервале (0,1).
Это совпадение?
И если нет, то как преобразовать это значение в расстояние от камеры до отрисованного видеокартой пикселя?

moka 19.08.2011 15:48

Ответ: Имитация водной поверхности.
 
Зачем приобразовывать, если есть функция просчёта дистанции между двумя точками в 3ёх мерном пространстве?

.Squid 19.08.2011 15:56

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от dsd (Сообщение 199408)
ProjectedZ() - пишется значение лежащее в (0,1)

Щито?

dsd 19.08.2011 16:13

Ответ: Имитация водной поверхности.
 
Ладно, что туда пишется? Ведь явно это значение зависит от расстояния между точкой и камерой.

Randomize 19.08.2011 18:12

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от .Squid (Сообщение 199412)
Щито?

Считай зум возвращает

dsd 19.08.2011 20:49

Вопрос по шейдеру рисующему расстояние от камеры до пикселей.
 

Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
texture diffuseTexture : TEXTURE_0; // текстура
// описываем sampler
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>; // привязываем текстуру
// устанавливаем адресацию координат
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
// устанавливаем фильтрацию
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
// устанавливаем уровень фильтрации
MaxAnisotropy = 4;
};
// входная структура для вершинного шейдера
struct VSInput
{
float4 position : POSITION;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
// структура для результата вершинного шейдера
struct VSOutput
{
float4 position : POSITION;
float depth : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{
// объект для выходных данных
VSOutput output;
// трансформируем позицию вершины
output.position = mul(input.position, matrixWorldViewProj);
// пишу глубину
output.depth = output.position.z;

// переписываем текстурные координаты
output.texCoords = input.texCoords;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{

//кодирую в красный то, что больше 256 и обрезаю его до диапозона (0,255)
//int red=clamp(trunc(input.depth/256), 0, 255);
int red=trunc(input.depth/25);
// пишу в зеленый то, что меньше 256
int green=trunc(input.depth-red*25);
//дробная часть
int blue=trunc(25*frac(input.depth));


return float4(0,green,blue,0);//input.depth;
}

// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}

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

Теперь основной вопрос. Будет ли расстояние которое я записал цветом в шейдере равным расстоянию между видимой вершиной и камерой в хорсе?


Часовой пояс GMT +4, время: 21:24.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot