|
3D-программирование Вопросы, касающиеся программирования 3D мира |
17.08.2011, 17:59
|
#256
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
используй occlusion queries. вроде бы они уже есть в ксорсе... спроси Сквида.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.08.2011, 18:15
|
#257
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Имитация водной поверхности.
OQ еще нет.
Дешевле рисовать вообще все квадратики, чем пытаться понять, видна вершина или нет. Тем более, используя для этого З-буфер о_О
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.08.2011, 22:19
|
#258
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация зед-буфера.
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); Потом для спроецированных координат моей вершины читать картинку в соответсвующем месте и если пиксель не черный, значит можно рисовать квадратик?
Последний раз редактировалось dsd, 23.10.2011 в 22:19.
|
(Offline)
|
|
18.08.2011, 22:26
|
#259
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
да, получишь карту глубины. только она будет линейная, а реальный з-буффер не совсем таковой. такие карты глубины для многих задач используют.
Потом для спроецированных координат моей вершины читать картинку в соответсвующем месте и если пиксель не черный, значит можно рисовать квадратик?
|
НЕТ. гонять результат рендера в оперативку полусмертельно.
уже я говорил про OQ, а если их нет, то Сквид сказал что дешевле рисовать все точки.
если будешь рисовать точки после отрисовки загораживающих объектов, видюха автоматически не будет обрабатывать загороженные пиксели.
в плане вертексов квадратики малонапряжные, так что не стоит городить тормознющие проверки, чтобы их отсеять.
в плане кол-ва вызовов отрисовки (отдельных объектов), много квадратиков = проблема, которая решается инстансингом (в ксорсе есть пример).
|
(Offline)
|
|
18.08.2011, 22:28
|
#260
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Я какбэ не игру писать начал Подразумевается, что будет видно адин меш и фпс даже 15 будет вполне нормальным
|
(Offline)
|
|
18.08.2011, 22:43
|
#261
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
я не знаю в каком приложении нужен искуственно пониженый чтением пикселей из текстур фпс ))
|
(Offline)
|
|
18.08.2011, 22:46
|
#262
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
В маем, хотя фпс низким врядли будет. Ибо пискселей будет читаться всего несколько тыщь причем на лок буфере.
|
(Offline)
|
|
18.08.2011, 23:03
|
#263
|
Нуждающийся
Регистрация: 17.12.2010
Адрес: Санкт-Петербург
Сообщений: 87
Написано 55 полезных сообщений (для 214 пользователей)
|
Ответ: Имитация водной поверхности.
dsd,
А это не важно сколько пикселей ты читаешь, хоть все хоть два - текстура перегоняется целиком, от этого и тормоза.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.08.2011, 23:07
|
#264
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Это все здорово, что оно лагать будет, лучше мне скажите че оно падает при xDrawImage()
А может можно в вершинном шейдере писать в цвет вершины флаг видимости точки? Или эти данные обратно в хорс не передадутся?
оффтоп: если в кодеблокс открыт xors3d.h, то функции хорса будут появлятся списком как в Visual Blitz. Не слишком очевидная зависимость
p.s. На сфере с 32 чего там, выдает 130 фпс. Шмертельные лаги, я ф такой пичали а с 64 так вообсче 60 фпс всего. Чорт побери!!! А с 128 так вообще всего 40, этого мало что бы вертексами подрыгать мышкой ((
Последний раз редактировалось dsd, 19.08.2011 в 00:20.
|
(Offline)
|
|
19.08.2011, 15:34
|
#265
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
При xCameraProject (camera,x1,y1,z1)
ProjectedX() - пишется x точки на экране
ProjectedY() - пишется y точки на экране
ProjectedZ() - пишется значение лежащее в (0,1)
Из непроверенных источников мне стало известно, что и z-buffer имеет значение в подозрительно похожем интервале (0,1).
Это совпадение?
И если нет, то как преобразовать это значение в расстояние от камеры до отрисованного видеокартой пикселя?
|
(Offline)
|
|
19.08.2011, 15:48
|
#266
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Зачем приобразовывать, если есть функция просчёта дистанции между двумя точками в 3ёх мерном пространстве?
|
(Offline)
|
|
19.08.2011, 15:56
|
#267
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Имитация водной поверхности.
Сообщение от dsd
ProjectedZ() - пишется значение лежащее в (0,1)
|
Щито?
__________________
|
(Offline)
|
|
19.08.2011, 16:13
|
#268
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Ладно, что туда пишется? Ведь явно это значение зависит от расстояния между точкой и камерой.
|
(Offline)
|
|
19.08.2011, 18:12
|
#269
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Имитация водной поверхности.
Сообщение от .Squid
Щито?
|
Считай зум возвращает
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
19.08.2011, 20:49
|
#270
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Вопрос по шейдеру рисующему расстояние от камеры до пикселей.
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();
}
}
Вот этот слегка модифицированный шейдер из шагов рисует такую картинку.
То что линии на модели рисуются паралельно экрану радует. Но я ожидал нечто более близкое к градиенту или так и должно было получиться?
Теперь основной вопрос. Будет ли расстояние которое я записал цветом в шейдере равным расстоянию между видимой вершиной и камерой в хорсе?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:40.
|