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)

.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();
}
}

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

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

moka 19.08.2011 20:54

Ответ: Имитация водной поверхности.
 
А где скрины снова???

dsd 19.08.2011 20:58

Ответ: Имитация водной поверхности.
 
Да прямо перед кодом шейдера, сэр.

Mr_F_ 19.08.2011 21:07

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

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

dsd 19.08.2011 21:11

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

Mr_F_ 19.08.2011 21:20

Ответ: Имитация водной поверхности.
 
всё делаешь как обычно, НО создаёшь текстуру с флагом 256 (если ниче не поменяли с момента когда я юзал ксорс) - в ней будут не 4 цвета по байту храниться, а один цвет в формате дробного числа.
ты просто делаешь в PS return depth и не паришься.

dsd 19.08.2011 21:34

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

//VS
float4x4 matrixWorldViewProj MATRIX_WORLDVIEWPROJ// матрица итоговая
float4x4 matrixWorld MATRIX_WORLD// матрица мировая

struct VS_INPUT
{
   
float4 position  POSITION;
};

struct VS_OUTPUT
{
   
float4 position  POSITION;
   
float depth  TEXCOORD0;
};

VS_OUTPUT main_VSVS_INPUT In )
{
    
VS_OUTPUT Out;
    
Out.position mulIn.positionmatrixWorldViewProj);
    
Out.depth=Out.position.z;
    return 
Out;
}

//PS
struct PS_INPUT
{
   
float depth    TEXCOORD0;
};

float4 main_PSPS_INPUT IN ) : COLOR0
{
    return 
IN.depth;
}; 

Ты про це? у меня он чет не работает :(

Mr_F_ 19.08.2011 21:50

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

dsd 19.08.2011 22:29

Ответ: Имитация водной поверхности.
 
output.depth = output.position.z; Вот это значение которое я делаю в вершинном шейдере равно расстоянию между этой вершиной и камерой в хорсе или нет?

Mr_F_ 19.08.2011 22:44

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

dsd 20.08.2011 14:52

Ответ: Имитация водной поверхности.
 
Пришла идея 3д редактора многопользовательского.

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

Основная фишка: других юзеров можно бить по рукам и встроенный голосовой чат :)

dsd 22.08.2011 16:56

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

Я написал какой-то ужас таки почти не рисующий ненужные вертексы без буферов глубины и прочей хрени :) правдо оно не рисует вертексы которые дальше позиции ентити от камеры :(

dsd 25.08.2011 20:35

Ответ: Имитация водной поверхности.
 
\window\main.cpp||In function 'int Horse()':|
\window\main.cpp|15|error: invalid conversion from 'HWND__*' to 'Handle'|
\window\main.cpp|15|error: initializing argument 1 of 'void xSetRenderWindow(Handle)'|
||=== Build finished: 2 errors, 1 warnings ===|

Как правильно HWND в хэндл окна понятный xSetRenderWindow(Handle) сконвертировать?

Mr_F_ 25.08.2011 21:13

Ответ: Имитация водной поверхности.
 
xSetRenderWindow((Handle)hwnd);

у меня работало

dsd 27.08.2011 02:25

Ответ: Имитация водной поверхности.
 
1. Сравниваю нормаль вершины и вектор от камеры до вершины. При угле меньшем 90 точка видна.
2. Пишу в массив координаты видимых точек и расстояния от камеры до каждой из точек. Сортирую точки по расстоянию. И еще разбиваю на квадраты само изображение и для каждого нахожу ближайшую точку.
3. Теперь для ближайшей узнаю каким полигонам она принадлежит, они точно видимые. Получаю первый и стопицотый «островок видимости». Ставлю флаг обработанным вершинам. Выкидываю те вершины которые не обработались и попали в границы островков.
4. Анализирую полигоны имеющие в себе стопудово видимые вершины. После обхода каждого острова маркирую скрывшиеся вершины, и так пока все вершины не получат флаг видимости-невидимости.

А теперь расскажите как это делают нормальные люди :)

moka 27.08.2011 02:33

Ответ: Имитация водной поверхности.
 
А у Xors3D нету возможности пикать триангл? Думаю если есть пики, то и триангл найти от пика не составит труда.
Таким образом имея данные о триангле, можно получить данные о его вершинах..

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

dsd 27.08.2011 02:41

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

Да есть пикать трианглы :) Я так сделал выбор вершины. Это проще чем буфер городить. Сэнкс.

dsd 27.08.2011 20:10

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

.Squid 27.08.2011 20:37

Ответ: Имитация водной поверхности.
 
Одной строчкой - никак. Только перебрать все поверхности и сравнить.
ЗЫ. Зачем это?

dsd 27.08.2011 20:44

Ответ: Имитация водной поверхности.
 
Я не могу сформулировать зачем мне это:-D. Просто лень во все функции добавлять новый флаг и медитировать на глюки не обрушивающие мое творение :) Экономил 5 минут вобщем.

dsd 27.08.2011 21:58

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


Я отбил себе руки бубном, но таки сделал по нажатому контрол выбор вершин как в приличных программах :)
[q] сбросить пикнутую поверхность.

Вроде не сразу падает теперь :)

dsd 28.08.2011 17:28

Ответ: Имитация водной поверхности.
 
Чем кроме названия отличается struct от union? Вообще ведь разницы не вижу. Разве что в структуре можно битовые размеры полей указывать. У меня из-за этого когнитивный диссонанс.

den 28.08.2011 17:38

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

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

вот вобщем http://programmersclub.ru/19/ :) там с картинками

dsd 28.08.2011 20:20

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

З.ы. дайте сцылку на нормальную пдфку про графический интерфейс для самых маленьких :)

А эклипс не лучше кодеблокс по функциональности? Или хрен редьки не слаще?

Mr_F_ 28.08.2011 21:43

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

Ведь как я понял в винапи это будет рисоваться гпу
это очень вряд ли

врайтпиксель НЕ ЮЗАЙ. юзай маленькие квады.

dsd 28.08.2011 21:49

Ответ: Имитация водной поверхности.
 
Нуууу... Разница по скорости будет некритична, а гемора больше и надо будет куеву тучу информации хранить я заипусь это доводить до рабочего состояния в си. Хотя... :) Может еще и гуй сделать трехмерным? :-/

Врайтпикселем можно спокойно рисовать в кадре порядка 100000 пикселей...

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

Mr_F_ 28.08.2011 23:01

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

будет некритична
будет критична.
рисовать пиксели = качать данные с рам во врам.
рисовать квады = нормальное хардварное ускорение.

Цитата:

Может еще и гуй сделать трехмерным? :-/
так везде и делают :)
можешь убедиться и выдрать гуй из любой современной игры 3д риппером.

dsd 30.08.2011 02:58

Ответ: Имитация водной поверхности.
 
Во время медитации на классы вдруг захотелось нарисовать лошадь. Получилась какая-то ";№%!2 с двумя мордами :)

Randomize 30.08.2011 02:59

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

Сообщение от dsd (Сообщение 200545)
Во время медитации на классы вдруг захотелось нарисовать лошадь. Получилась какая-то ";№%!2 с двумя мордами :)

Пфф... Какой отличный оффтоп.
Ты б блог завёл что ли :/

dsd 31.08.2011 00:14

Ответ: Имитация водной поверхности.
 
Я таки сделал систему частиц прикидывающуюся вершинами модели. И даже сделал размер частиц постоянным, в том смысле, что площадь на экране у них стабильна. Это быстрей рисования пикселей, но это не полюдски :-D .

И оно даже вообще не падает в отличии от предыдущей кучи команд.

Но как же тяжко мне дались эти двацать строчек кода...

з.ы. [q] сбросить пикнутую поверхность.

CRASHER 01.09.2011 22:52

Ответ: Имитация водной поверхности.
 
Объясните пожалусто, как все последние посты относятся к водной поверхности? Оо,

NitE 01.09.2011 22:54

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

Randomize 02.09.2011 00:07

Ответ: Имитация водной поверхности.
 
dsd, может тему переименовать?

dsd 02.09.2011 00:09

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

В связи с утратой связи с бзд


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

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