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 29.06.2011 17:48

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

moka 29.06.2011 17:53

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

dsd 29.06.2011 18:24

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

moka 29.06.2011 19:06

Ответ: Имитация водной поверхности.
 
Это две разные вещи, снова говорю.
Шейдеры никак не относятся к FFP - это две разные сферы реализации, и общего там почти ничего нет. Совсем разный подход. Единственное одинаково, это данные которые используешь, но это изучается и там и там.

dsd 29.06.2011 19:17

Ответ: Имитация водной поверхности.
 
Есть еще один мотив, intel gma 945 хоть и поддерживает шейдеры 3.0, но программно, и чую задом, что не полностью. А пока единственно, что осталось это чудо нетбук леново идеяпад с 10, подключенный к 28" монику :-D.

moka 29.06.2011 19:30

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

maxturbo 29.06.2011 21:37

Ответ: Имитация водной поверхности.
 
Чуть чуть о Shader'ах:

Shader – это специальная программа для графического процессора (GPU, Graphical Processing Unit), управляющая поведением определённой (шейдерной) стадии графического конвейера видео-карты, занимающаяся обработкой входных данных и “отдающая” результат обработки этих данных. В данный момент наиболее часто используются вершинные и пиксельные шейдеры (vertex & pixel shaders), но на самом деле в Direct3D существует не два, а больше видов шейдеров, которые отличаются как назначением, так и способами их применения:

Вершинный шейдер (vertex shader) – шейдер, занимающиеся обработкой вершин модели
Пиксельный шейдер (pixel shader) – шейдер, выполняющийся для каждого выводимого на экран пиксела
Геометрический шейдер (geometry shader) (DirectX 10) – это шейдер, обрабатывающий геометрию. В отличие от вертексного шейдера, он обрабатывает не отдельные вершины, а наборы вершин, представляющих из себя геометрические примитивы (например, треугольники)
Hull-Shader – (DirectX 11) шейдер тесселяции
Domain-Shader – (DirectX 11) шейдер калькуляции внутри патча

Pixel shaders (или фрагментный) шейдер – это шейдерная программа, которая занимается обработкой отдельных пикселей изображения. В конечном итоге, по большей части, именно pixel shader определяет насколько красиво и естественно будет выглядеть конечное изображение. Причём, пиксельные шейдеры могут использоваться не только для формирования самого изображения, но и для его пост-процессинга, т.е. для создания некоторых спец-эффектов.

Vertex shader (вершинный шейдер) занимается обработкой данных вершин модели. Такие данные как координаты вершины в пространстве, текстурные координаты, тангент-вектор, бинормаль, нормаль обрабатываются как раз вершинными шейдерами. Кроме того, vertex shader занимается преобразованием модели из пространства модели в пространство мира/вида/проекции. Он может сам генерировать текстурные координаты или менять форму самой модели, например, “пустить” волны по ровной поверхности воды или как-то изогнуть модель, провести трансформации в соответствии со скелетной анимацией, может почитать освещённость вершин модели и много чего ещё…

dsd 29.06.2011 22:40

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

Код:

Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Dither 0
Dim plane#(0,0)
Dim CubeData#(0,0)
Dim quadsys#(0,0)
Global pivot,camera,mxs#,mys#,Light,timer3,debugcam,watermesh,watertex,dsd

;Include "bin/antifrizedcrab.bb"

watermesh=preparations()

While Not  ((KeyDown(56) And KeyHit(62)) Or  (KeyHit(56) And KeyDown(62))  Or KeyHit(1))
timer3=MilliSecs()
PositionTexture watertex,u#,v#
u#=Sin(MilliSecs()/500)

GrimMagicWater(watermesh,3,6,10,1)

UpdateWorld
RenderWorld
control(0.5,1.4)
Flip 0
Wend
End


Function  GrimMagicWater(meshid,waveheight#,horizwave#,wavelength#,speed#)
PointEntity light,camera
PositionEntity light,225*Sin(MilliSecs()/30),65,225*Cos(MilliSecs()/30)
PositionEntity watermesh,EntityX(camera,1),0,EntityZ(camera,1)
RotateEntity watermesh,0,EntityYaw(camera,1)-45,0
If EntityY(camera,1)<1 Then PositionEntity camera,EntityX(camera,1),1,EntityZ(camera,1),1
ScaleTexture watertex,1+Sin(MilliSecs()/100)/10,1+Cos(MilliSecs()/50)/10

wavehorizlength#=35
;speed#=1
time#=MilliSecs()*speed

mesh=meshid
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)

For i=0 To qvert-1
x000#=plane#(i,0)
y000#=plane#(i,2)
z000#=0
TFormPoint x000,z000,y000,mesh,0
x00#=TFormedX()
y00#=TFormedZ()

z01#=waveheight*Cos(time/wavelength+x00*wavelength/3)+horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)
x01#=x00-waveheight*Cos(time/wavelength+x00*wavelength/3)
y01#=y00-horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)
TFormPoint x01,z01,y01,0,mesh
VertexCoords meshsurf,i,TFormedX(),TFormedY(),TFormedZ()
plane#(i,3)=TFormedX() ;x
plane#(i,4)=TFormedY() ;y
plane#(i,5)=TFormedZ() ;z
VertexTexCoords meshsurf,i,x00/25,y00/25
plane#(i,6)=0
plane#(i,7)=0
plane#(i,8)=0
Next

qtrian=CountTriangles(meshsurf)
For i=0 To qtrian-1
v0=TriangleVertex (meshsurf,i,0)
v1=TriangleVertex(meshsurf,i,1)
v2=TriangleVertex (meshsurf,i,2)
x0#=plane#(v0,3) : y0#=plane#(v0,4): z0#=plane#(v0,5)
x1#=plane#(v1,3)-x0 : y1#=plane#(v1,4)-y0 : z1#=plane#(v1,5)-z0
x2#=plane#(v2,3)-x0 : y2#=plane#(v2,4) -y0: z2#=plane#(v2,5)-z0
;теперь найду уравнение по трем точкам
;для х это y1*z2-y2*z2
a#=(y1*z2-y2*z2)
b#=-(x1*z2-x2*z3)
c#=(x1*y2-x2*y1)
TFormVector a,b,c,mesh,mesh
xv#=TFormedX()
yv#=TFormedY()
zv#=TFormedZ()
plane#(v0,6)=plane#(v0,6)+xv/plane#(v0,9)
plane#(v1,6)=plane#(v1,6)+xv/plane#(v1,9)
plane#(v2,6)=plane#(v2,6)+xv/plane#(v2,9)

plane#(v0,7)=plane#(v0,7)+yv/plane#(v0,9)
plane#(v1,7)=plane#(v1,7)+yv/plane#(v1,9)
plane#(v2,7)=plane#(v2,7)+yv/plane#(v2,9)

plane#(v0,8)=plane#(v0,8)+zv/plane#(v0,9)
plane#(v1,8)=plane#(v1,8)+zv/plane#(v1,9)
plane#(v2,8)=plane#(v2,8)+zv/plane#(v2,9)
Next

For i=0 To qvert-1
VertexNormal meshsurf,i,plane#(i,6),plane#(i,7),plane#(i,8)
Next

End Function


Function preparations()

pivot=CreatePivot()
PositionEntity pivot,0,3,-10
camera=CreateCamera(pivot)
CameraClsColor camera,0,75,151
light=CreateLight()
MeshLight=CreateSphere(6,light)
;ScaleMesh meshlight,0.3,0.3,0.3
EntityFX meshlight,1
AmbientLight 127,127,127
watermesh=LoadMesh("mesh/water.b3d")
sky=loadskybox()
testtex=CreateTexture(256,256,256)
SetBuffer TextureBuffer(testtex)
Color 127,127,127
Rect 0,0,128,128
Rect 128,128,128,128
Color 235,240,235
Rect 0,128,128,128
Rect 128,0,128,128
SetBuffer BackBuffer()
watertex=LoadTexture("maps/water.jpg")
SetCubeMode watertex,1
EntityTexture watermesh,watertex,0,1
EntityAlpha watermesh,0.95
mesh=watermesh
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
Dim plane#(qvert,10)
For i=0 To qvert-1
plane#(i,0)=VertexX(meshsurf,i) ;x
plane#(i,1)=VertexY(meshsurf,i) ;x
plane#(i,2)=VertexZ(meshsurf,i) ;x
Next
qtrian=CountTriangles(meshsurf)

For i=0 To qtrian-1
v0=TriangleVertex (meshsurf,i,0)
v1=TriangleVertex(meshsurf,i,1)
v2=TriangleVertex (meshsurf,i,2)
plane#(v0,9)=plane#(v0,9)+1
plane#(v1,9)=plane#(v1,9)+1
plane#(v2,9)=plane#(v2,9)+1
Next
Return watermesh
End Function

Function control(speed#,mousesensitivity#)
If KeyDown(2) WireFrame True Else WireFrame False
mxs#=mxs#+(MouseXSpeed()/5.0)
mys#=mys#+(MouseYSpeed()/5.0)
RotateEntity camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
If KeyDown(17) Or KeyDown(200) MoveEntity camera,0,0,speed#
If KeyDown(31) Or KeyDown(208) MoveEntity camera,0,0,-speed#
If KeyDown(30) Or KeyDown(203) MoveEntity camera,-speed#,0,0
If KeyDown(32) Or KeyDown(205) MoveEntity camera,speed#,0,0
PositionEntity pivot,EntityX#(camera,1),EntityY#(camera,1),EntityZ#(camera,1)
PositionEntity camera,0,0,0
Text 100,10,"polygons in view "+TrisRendered()
If (MilliSecs()-timer3)<>0 Text 100,40,"Frames per second is: "+1000/(MilliSecs()-timer3)
End Function


Function LoadSkyBox(  )
    m=CreateMesh()
    ;front face
    b=LoadBrush( "maps\sky2_FR.jpg",49 )
    s=CreateSurface( m,b )
    AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
    AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
    AddTriangle s,0,1,2:AddTriangle s,0,2,3:
    FreeBrush b
    ;right face
    b=LoadBrush( "maps\sky2_LF.jpg",49 )
    s=CreateSurface( m,b )
    AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
    AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
    AddTriangle s,0,1,2:AddTriangle s,0,2,3
    FreeBrush b
    ;back face
    b=LoadBrush( "maps\sky2_BK.jpg",49 )
    s=CreateSurface( m,b )
    AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
    AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
    AddTriangle s,0,1,2:AddTriangle s,0,2,3
    FreeBrush b
    ;left face
    b=LoadBrush( "maps\sky2_RT.jpg",49 )
    s=CreateSurface( m,b )
    AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
    AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
    AddTriangle s,0,1,2:AddTriangle s,0,2,3
    FreeBrush b
    ;top face
    b=LoadBrush( "maps\sky2_UP.jpg",49 )
    s=CreateSurface( m,b )
    AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
    AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
    AddTriangle s,0,1,2:AddTriangle s,0,2,3
    FreeBrush b
    ;bottom face   
    b=LoadBrush( "maps\sky2_DN.jpg",49 )
    If b=0 b=CreateBrush (0,30,50)
    s=CreateSurface( m,b )
    AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
    AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
    AddTriangle s,0,1,2:AddTriangle s,0,2,3
    FreeBrush b
    ScaleMesh m,500,500,500
    FlipMesh m
    EntityFX m,1+8
    EntityOrder m,999
    Return m
End Function


dsd 30.06.2011 00:23

Ответ: Имитация водной поверхности.
 
http://developer.nvidia.com/fx-composer Что вы можете сказать об этом? Или для нуба это как дать болгарку питекантропу?

O_o, на глаз запалил ошибку в своем коде, где тформлю вместо нормали вектор.

h1dd3n 30.06.2011 00:29

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

maxturbo 30.06.2011 00:54

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

Сообщение от h1dd3n (Сообщение 193738)
Вообще такие инструменты это не очень то удобно, имхо. Но если все же хочется "удобной" среды разработки шейдеров, то лучше взять ATI RenderMonkey.

RenderMonkey самое то :)

dsd 30.06.2011 02:35

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

Чето в нвидиа как в цупе О_о.

maxturbo 30.06.2011 02:56

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

Сообщение от dsd (Сообщение 193748)
Мне кажется или самый удобный способ производить в башке все манипуляции? А учиться шейдерам будет проще тыкая пальцем рабочий пока он не изменится предсказуемым образом?
Чето в нвидиа как в цупе О_о.

Пользуйся RenderMonkey, тупо тыкать? Ммм конечно не идеальный способ... Все же лучше почитать тебе по конкретней про назначение шейдеров (вертексные и пиксельные) только тогда поймешь :) Где то видел книгу очень хорошую по шейдерам, там описывают работу на программе RenderMonkey, поищи ее :)

h1dd3n 30.06.2011 02:59

Ответ: Имитация водной поверхности.
 
советую глянуть cg tutorial, gpu gems 1, 2, 3

maxturbo 30.06.2011 03:28

Ответ: Имитация водной поверхности.
 
А я вот это советую :)
Shader


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

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