|
3D-программирование Вопросы, касающиеся программирования 3D мира |
12.08.2011, 22:39
|
#211
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Шейдер теней.
1. Делаем рендер с камеры стоящей в позиции света и ориентированной по направлению света. Результатом должна стать текстура, в которой цветом будет записано расстояние от видимых пикселей до источника света. Допустим красный+зеленый кодируют целую часть, а голубой дробную.
2. Далее рендрим сцену с обычной позиции камеры. Вершинный шейдер передает в пиксельный позиции и текстурные координаты вершин. Все тени в пиксельном шейдере. Передаем в шейдер позицию источника света и текстуру из п.1. Далее используя матрицу проекции для той камеры, что стоит в позиции источника света узнаю, верхний ли этот пиксель или нет, если нет, значит он в тени, значит надо совершить затенение, что само по себе тривиальная задача. И тут появляется возможность супер-дюпер манипулирования параметрами тени, хошь тени как на луне, хошь святящиеся. В итоге должно получиться само затенение.
Все это можно объединить в одном шейдере с двумя проходами. Первый проход создание текстуры глубины сцены с позиции света. Камеру создавать не нужно, а на основании позиции света можно замутить матрицу проекции для камеры как бы существующей в этом месте.
Для отсутствия швов карту глубины можно сделать кубомапой.
Хотя бы в общих чертах я прав?
|
(Offline)
|
|
12.08.2011, 23:27
|
#212
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
Допустим красный+зеленый кодируют целую часть, а голубой дробную.
|
можно просто использовать флоатовую одноканальную текстуру (R32F).
текстурные координаты вершин
|
они тут причём?
в VS считаешь просто помимо обычной позиции, позицию, полученную переменожением на шадоумап-матрицу. шадоумап-матрица = world * lightView * lightProj. потом эту матрицу, либо результат перемножения надо перевести в 0-1 диапазон, чтобы использовать как текстурные координаты для карты глубины. удобнее изначально шадоумап-матрицу умножить на скейлящую в нужный диапазон матрицу.
Для отсутствия швов карту глубины можно сделать кубомапой.
|
??? для точечных лайтов так делают, для направленного источника не нужно.
Камеру создавать не нужно
|
ну камера в ксорсе тебе бесплатно может предоставить view и proj матрицы не нагружая рендер. так что нет смысла самому конструировать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.08.2011, 23:53
|
#213
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Вообще протупил, не нужны они, но в принципе, можно сделать как бы светящиеся участки мешей в зависимости от цвета наложенной текстуры.
|
(Offline)
|
|
13.08.2011, 14:39
|
#214
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
char fps;
xText (10,20,fps=xGetFPS());
выдает:
\init.cpp|23|error: initializing argument 3 of 'void xText(int, int, const char*, int, int)'|
Это типа я этой командой могу только константы печатать? O_o
|
(Offline)
|
|
13.08.2011, 14:50
|
#215
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Имитация водной поверхности.
так?
xText (10,20,"fps"+xGetFPS());
|
|
(Offline)
|
|
13.08.2011, 14:54
|
#216
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
так запускает, секунду печатает fps, потом ничего не печатает
|
(Offline)
|
|
13.08.2011, 14:56
|
#217
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
char содержит 1 символ (1 байт). для строк используй std::string.
#include <string>
using namespace std;
...
чтобы конвертировать число в стринг, придётся написать отдельную функцию:
string itoa( int n )
{
char buff[32];
sprintf(buff,"%d",n);
return string( buff );
}
...
xText (10,20, (string("fps: ") + itoa(xGetFPS())).c_str() );
необязательно так париться каждый раз - можно расширить стринг, дабы он мог нормально складываться с циферками.
а вообще тебе стоит читать книжки по с++ )
---
исправил ошибочку
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.08.2011, 14:59
|
#218
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Так и читаю.
Щас вроде в башке устаканивается отличие и структура условий, циклов. Вроде ниче такой язык программирования
|
(Offline)
|
|
13.08.2011, 16:55
|
#219
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Имитация водной поверхности.
Вроде ниче такой язык программирования
|
да. мировое сообщество программистов с тобой солидарно
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
13.08.2011, 18:47
|
#220
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Небольшой код для C++ и Xors3D, с вращающимся тором и перемещением камеры. Для Code::Blocks 10.05
#include <iostream>
#include "xors3d.h"
//#include <string>
#include <cmath>
using namespace std;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
xAppTitle( "Basic start" );
xGraphics3D( 640,480,false,false,true );
void Control(double speed, double mousesensitivity, Handle Camera, Handle Pivot);
Handle Cube = xCreateTorus(16,4,1);
Handle Pivot = xCreatePivot();
Handle Camera = xCreateCamera(Pivot);
Handle Light = xCreateLight(LIGHT_DIRECTIONAL);
xTurnEntity(Light, 30.0, 30.0, 0.0);
xMoveEntity(Cube, 0.0, 0.0, 10.0);
while (xWinMessage("WM_CLOSE")==0 && xKeyHit(KEY_ESCAPE)==false)
{
xTurnEntity(Cube, 1.0, 1.0, 1.0);
xMoveEntity(Cube,0,0.2*sin(xMillisecs()/1000),0);
xRenderWorld();
Control(1,1,Camera,Pivot);
xFlip();
}
return 0;
}
void Control(double speed, double mousesensitivity, Handle Camera, Handle Pivot) {
double mxs;
double mys;
if (xKeyDown(2)) xWireframe(true);
if (not xKeyDown(2)) xWireframe(false);
xText (10,10,"i'm still not able to use properly this function, so it's reason why this have an console output :)");
if (xKeyHit(57)) {cout<<"FPS is "<<xGetFPS(); cout<<", time is "<<xMillisecs()<<"\n"; };
mxs+=xMouseXSpeed()/5.0;
mys+=xMouseYSpeed()/5.0;
if (xKeyHit(3)) {cout<<mxs<<" "<<mys<<"\n";};
xTurnEntity (Camera,mousesensitivity*mys,-mousesensitivity*mxs,0);
xMoveMouse (xGraphicsWidth()/2,xGraphicsHeight()/2);
if (xKeyDown(17) || xKeyDown(200)) xMoveEntity (Camera,0,0,speed);
if (xKeyDown(31) || xKeyDown(208)) xMoveEntity (Camera,0,0,-speed);
if (xKeyDown(30) || xKeyDown(203)) xMoveEntity (Camera,-speed,0,0);
if (xKeyDown(32) || xKeyDown(205)) xMoveEntity (Camera,speed,0,0);
xPositionEntity (Pivot,xEntityX(Camera,1),xEntityY(Camera,1),xEntityZ(Camera,1));
xPositionEntity (Camera,0,0,0);
}
Ибо в гугле на русском языке этого нет, но пусть будет.
Последний раз редактировалось dsd, 23.10.2011 в 22:19.
|
(Offline)
|
|
13.08.2011, 18:54
|
#221
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Имитация водной поверхности.
dsd, не думал блог завести ?
|
(Offline)
|
|
13.08.2011, 19:00
|
#222
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
С названием: Быдлокод для хорса?
|
(Offline)
|
|
13.08.2011, 19:02
|
#223
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Имитация водной поверхности.
С любым названием.
|
(Offline)
|
|
13.08.2011, 19:05
|
#224
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Зачем? Кто его будет читать? и указывать на самые тупые места моего кода?
|
(Offline)
|
|
13.08.2011, 19:20
|
#225
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Имитация водной поверхности.
Теже люди которые читают то что ты здесь выкладываешь, наверное.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:48.
|