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)

dsd 12.08.2011 22:39

Ответ: Имитация водной поверхности.
 
Шейдер теней.
1. Делаем рендер с камеры стоящей в позиции света и ориентированной по направлению света. Результатом должна стать текстура, в которой цветом будет записано расстояние от видимых пикселей до источника света. Допустим красный+зеленый кодируют целую часть, а голубой дробную.
2. Далее рендрим сцену с обычной позиции камеры. Вершинный шейдер передает в пиксельный позиции и текстурные координаты вершин. Все тени в пиксельном шейдере. Передаем в шейдер позицию источника света и текстуру из п.1. Далее используя матрицу проекции для той камеры, что стоит в позиции источника света узнаю, верхний ли этот пиксель или нет, если нет, значит он в тени, значит надо совершить затенение, что само по себе тривиальная задача. И тут появляется возможность супер-дюпер манипулирования параметрами тени, хошь тени как на луне, хошь святящиеся. В итоге должно получиться само затенение.
Все это можно объединить в одном шейдере с двумя проходами. Первый проход создание текстуры глубины сцены с позиции света. Камеру создавать не нужно, а на основании позиции света можно замутить матрицу проекции для камеры как бы существующей в этом месте.
Для отсутствия швов карту глубины можно сделать кубомапой.

Хотя бы в общих чертах я прав?

Mr_F_ 12.08.2011 23:27

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

Допустим красный+зеленый кодируют целую часть, а голубой дробную.
можно просто использовать флоатовую одноканальную текстуру (R32F).
Цитата:

текстурные координаты вершин
они тут причём?
в VS считаешь просто помимо обычной позиции, позицию, полученную переменожением на шадоумап-матрицу. шадоумап-матрица = world * lightView * lightProj. потом эту матрицу, либо результат перемножения надо перевести в 0-1 диапазон, чтобы использовать как текстурные координаты для карты глубины. удобнее изначально шадоумап-матрицу умножить на скейлящую в нужный диапазон матрицу.
Цитата:

Для отсутствия швов карту глубины можно сделать кубомапой.
??? для точечных лайтов так делают, для направленного источника не нужно.
Цитата:

Камеру создавать не нужно
ну камера в ксорсе тебе бесплатно может предоставить view и proj матрицы не нагружая рендер. так что нет смысла самому конструировать.

dsd 12.08.2011 23:53

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

dsd 13.08.2011 14:39

Ответ: Имитация водной поверхности.
 
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

Nex 13.08.2011 14:50

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

xText (10,20,"fps"+xGetFPS());

dsd 13.08.2011 14:54

Ответ: Имитация водной поверхности.
 
так запускает, секунду печатает fps, потом ничего не печатает :)

Mr_F_ 13.08.2011 14:56

Ответ: Имитация водной поверхности.
 
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() );

необязательно так париться каждый раз - можно расширить стринг, дабы он мог нормально складываться с циферками.
а вообще тебе стоит читать книжки по с++ )

---
исправил ошибочку

dsd 13.08.2011 14:59

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

Щас вроде в башке устаканивается отличие и структура условий, циклов. Вроде ниче такой язык программирования :)

HolyDel 13.08.2011 16:55

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

Вроде ниче такой язык программирования
да. мировое сообщество программистов с тобой солидарно

dsd 13.08.2011 18:47

Ответ: Имитация водной поверхности.
 
Небольшой код для 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);
}

Ибо в гугле на русском языке этого нет, но пусть будет.

NitE 13.08.2011 18:54

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

dsd 13.08.2011 19:00

Ответ: Имитация водной поверхности.
 
С названием: Быдлокод для хорса?

NitE 13.08.2011 19:02

Ответ: Имитация водной поверхности.
 
С любым названием.

dsd 13.08.2011 19:05

Ответ: Имитация водной поверхности.
 
Зачем? Кто его будет читать? и указывать на самые тупые места моего кода?

NitE 13.08.2011 19:20

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


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

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