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)

Mr_F_ 29.06.2011 00:59

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

dsd 29.06.2011 00:59

Ответ: Имитация водной поверхности.
 
Tormoz, опять нифига не работает, когда куплю нормальный ноут, я скажу. Не надо травмировать мою психику показывая ущербность нетбука:))

dsd 29.06.2011 01:02

Ответ: Имитация водной поверхности.
 
Мож завести тему Нубшоу по хорсу и шэйдерам?

Я только щас спалил, что почти каждая команда хоть и пишется также, но структурно отличается :-D

dsd 29.06.2011 01:49

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

Include "xors3d.bb"
Global pivot,camera,mxs#,mys#,Light,watermesh,watertex
Dim plane#(0,0)
Dim noise#(0)
xGraphics3D(800, 600, 32, False, 0)

watermesh=preparations()


While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))


GrimMagicWater(watermesh,3,6,10,Rnd(0.05,0.08),1)

xUpdateWorld
xRenderWorld()
Control(0.2,1)
xFlip()
Wend
End


Function GrimMagicWater(meshid,waveheight#,horizwave#,wavel ength#,Noiseamplitude#,speed#)
xPointEntity light,camera
xPositionEntity (light,225*Sin(xMillisecs()/30),145,225*Cos(xMillisecs()/30))
xPositionEntity (watermesh,xEntityX(camera,1),0,xEntityZ(camera,1) )
xRotateEntity (watermesh,0,xEntityYaw(camera,1)-45,0 )
If xEntityY(camera,1)<1 Then xPositionEntity camera,xEntityX(camera,1),1,xEntityZ(camera,1),1
xScaleTexture watertex,1+Sin(xMillisecs()/100)/10,1+Cos(xMillisecs()/50)/10
;waveheight#=1
;horizwave#=3
;Noiseamplitude#=0.14
;wavelength#=10 ; ìåíüøåå çíà÷åíèå îçíà÷àåò áîëüøóþ äëèíó
wavehorizlength#=35
;speed#=1
time#=xMillisecs()*speed

mesh=meshid
meshsurf=xGetSurface(mesh,0)
qvert=xCountVertices(meshsurf)
For i=0 To qvert-1
x000#=plane#(i,0)
y000#=plane#(i,2)
z000#=0
xTFormPoint (x000,z000,y000,mesh,0)
x00#=xTFormedX()
y00#=xTFormedZ()

z01#=waveheight*Cos(time/wavelength+x00*wavelength/3)+horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)+Noiseamplitude*Sin(noise#(i)+time/4)
x01#=x00-waveheight*Cos(time/wavelength+x00*wavelength/3)+Noiseamplitude*Cos(noise#(i)+time/4)
y01#=y00-horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)+Noiseamplitude*Sin(noise#(i)+time/4)
xTFormPoint (x01,z01,y01,0,mesh)
xVertexCoords meshsurf,i,xTFormedX(),xTFormedY(),xTFormedZ()
xVertexTexCoords meshsurf,i,x00/25,y00/25
Next
xUpdateNormals mesh
End Function


Function preparations()
pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light = xCreateLight()
watermesh = xLoadMesh("mesh/water.b3d")
xPositionEntity(watermesh, 0.0, 0.0, 0.0)
watertex=xLoadTexture("maps/water.jpg")
xEntityTexture (watermesh,watertex)
mesh=watermesh
meshsurf=xGetSurface(mesh,0)
qvert=xCountVertices(meshsurf)
Dim plane#(qvert,3)
Dim noise#(qvert)
For i=0 To qvert-1
plane#(i,0)=xVertexX(meshsurf,i) ;x
plane#(i,1)=xVertexY(meshsurf,i) ;x
plane#(i,2)=xVertexZ(meshsurf,i) ;x
noise#(i)=Rnd(0,359.99)
Next
Return watermesh
End Function

Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
xText(10, 10, "FPS: " + xGetFPS())
xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEnt ityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function

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

Люди, скажите сразу есть под блитцевское иде движок ищо лучше хорса?:rolleyes:

HolyDel 29.06.2011 01:57

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

Люди, скажите сразу есть под блитцевское иде движок ищо лучше хорса?
нет
и врятли будет

h1dd3n 29.06.2011 02:16

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

Сообщение от dsd (Сообщение 193592)
Таки запустил это на хорсе >:)

Чет качво картинки вата... Кинь в пнг плз...

dsd 29.06.2011 02:23

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

NitE 29.06.2011 06:36

Ответ: Имитация водной поверхности.
 
Если ещё надо.
xMOUSE_LEFT = 1
xMOUSE_RIGHT = 2
xMOUSE_MIDDLE = 3
xMOUSE4 = 4
xMOUSE5 = 5
xMOUSE6 = 6
xMOUSE7 = 7
xMOUSE8 = 8
xKEY_ESCAPE = 1
xKEY_1 = 2
xKEY_2 = 3
xKEY_3 = 4
xKEY_4 = 5
xKEY_5 = 6
xKEY_6 = 7
xKEY_7 = 8
xKEY_8 = 9
xKEY_9 = 10
xKEY_0 = 11
xKEY_MINUS = 12
xKEY_EQUALS = 13
xKEY_BACK = 14
xKEY_TAB = 15
xKEY_Q = 16
xKEY_W = 17
xKEY_E = 18
xKEY_R = 19
xKEY_T = 20
xKEY_Y = 21
xKEY_U = 22
xKEY_I = 23
xKEY_O = 24
xKEY_P = 25
xKEY_LBRACKET = 26
xKEY_RBRACKET = 27
xKEY_RETURN = 28
xKEY_ENTER = xKEY_RETURN
xKEY_LCONTROL = 29
xKEY_RCONTROL = 157
xKEY_A = 30
xKEY_S = 31
xKEY_D = 32
xKEY_F = 33
xKEY_G = 34
xKEY_H = 35
xKEY_J = 36
xKEY_K = 37
xKEY_L = 38
xKEY_SEMICOLON = 39
xKEY_APOSTROPHE = 40
xKEY_GRAVE = 41
xKEY_LSHIFT = 42
xKEY_BACKSLASH = 43
xKEY_Z = 44
xKEY_X = 45
xKEY_C = 46
xKEY_V = 47
xKEY_B = 48
xKEY_N = 49
xKEY_M = 50
xKEY_COMMA = 51
xKEY_PERIOD = 52
xKEY_SLASH = 53
xKEY_RSHIFT = 54
xKEY_MULTIPLY = 55
xKEY_MENU = 56
xKEY_SPACE = 57
xKEY_F1 = 59
xKEY_F2 = 60
xKEY_F3 = 61
xKEY_F4 = 62
xKEY_F5 = 63
xKEY_F6 = 64
xKEY_F7 = 65
xKEY_F8 = 66
xKEY_F9 = 67
xKEY_F10 = 68
xKEY_NUMLOCK = 69
xKEY_SCROLL = 70
xKEY_NUMPAD7 = 71
xKEY_NUMPAD8 = 72
xKEY_NUMPAD9 = 73
xKEY_SUBTRACT = 74
xKEY_NUMPAD4 = 75
xKEY_NUMPAD5 = 76
xKEY_NUMPAD6 = 77
xKEY_ADD = 78
xKEY_NUMPAD1 = 79
xKEY_NUMPAD2 = 80
xKEY_NUMPAD3 = 81
xKEY_NUMPAD0 = 82
xKEY_DECIMAL = 83
xKEY_TILD = 86
xKEY_F11 = 87
xKEY_F12 = 88
xKEY_NUMPADENTER = 156
xKEY_RMENU = 221
xKEY_PAUSE = 197
xKEY_HOME = 199
xKEY_UP = 200
xKEY_PRIOR = 201
xKEY_LEFT = 203
xKEY_RIGHT = 205
xKEY_END = 207
xKEY_DOWN = 208
xKEY_NEXT = 209
xKEY_INSERT = 210
xKEY_DELETE = 211
xKEY_LWIN = 219
xKEY_RWIN = 220
xKEY_BACKSPACE = xKEY_BACK
xKEY_NUMPADSTAR = xKEY_MULTIPLY
xKEY_RALT = 184
xKEY_CAPSLOCK = 58
xKEY_NUMPADMINUS = xKEY_SUBTRACT
xKEY_NUMPADPLUS = xKEY_ADD
xKEY_NUMPADPERIOD = xKEY_DECIMAL
xKEY_DIVIDE = 181
xKEY_NUMPADSLASH = xKEY_DIVIDE
xKEY_LALT = 56
xKEY_UPARROW = xKEY_UP
xKEY_PGUP = xKEY_PRIOR
xKEY_LEFTARROW = xKEY_LEFT
xKEY_RIGHTARROW = xKEY_RIGHT
xKEY_DOWNARROW = xKEY_DOWN
xKEY_PGDN = xKEY_NEXT

dsd 29.06.2011 12:30

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

dsd 29.06.2011 16:34

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

На каждую точку меша я делаю два тформпоинта.
Не будет ли выгодней разово для всего меша тформвектор с такой координатой(1,1,1) а потом для каждой точки получатб координату следующей конструукцией: сохраненая х координата вершины на тформленный х от такого вектора + икс ентити содержащей вершину, и обратное преобразование.
Команда т форм ведь в вычислеениях имеет кучу синусов ?

И еще один вопрос. Что быстрей, сохранять данные в банк или в массив?

moka 29.06.2011 17:34

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

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

dsd 30.06.2011 12:47

Ответ: Имитация водной поверхности.
 
http://netlib.narod.ru/library/book0...ges/f02_09.jpgВот эта матрица нужна только для пиксельных шейдеров?

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

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

Mr_F_ 30.06.2011 13:19

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

Вот эта матрица нужна только для пиксельных шейдеров?
Цитата:

и чет нигде не увидел создание источника света, а только сферы, которая походу служит маркером для координат света. То есть обычный свет в сцене для шейдеров вреден?
вертекс шейдеры полностью с нуля считают позиции вертексов и другие данные на каждый вертекс.
чтобы показать на экран геометрию, имея координаты её вертексов в пространстве объекта - тебе надо умножить их сначала на world матрицу (это матрица трансформаций объекта, она содержит позицию, ротейт, скейл. без неё ты тоже увидишь объект на экране, но в нуле координат, неротированный, с единичным скейлом), потом на view матрицу (это инвертированная матрица трансформаций камеры - при умножении на неё, мы получаем что позиция камеры - это ноль координат, то же самое и с вращением, проще говоря пододвигаем всю геометрию к камере), потом на projection, который ты и указал - это сложная матрица, которая сделает перспективное сокращение.
в реале можно перемножить все эти матрицы заранее и подавать как одну WorldViewProj, одним умножением на которую, можно получить объект в нужном месте - ксорс позволяет её сразу передавать.

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

dsd 30.06.2011 13:24

Ответ: Имитация водной поверхности.
 
Я походу скоро к вижуал студии деградирую >_<

h1dd3n 30.06.2011 14:37

Ответ: Имитация водной поверхности.
 
И обнаружишь что писать код там очень удобно, а для подсветки hlsl, fx файлов есть NShader.

dsd 30.06.2011 14:38

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

Это значит, что мне нужно обновить директикс или видеокарту?

moka 30.06.2011 14:40

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

dsd 30.06.2011 14:48

Ответ: Имитация водной поверхности.
 
Intel gma 950 вообще не видеокарта по ощущениям(matrox g400 и то резче в разы был в паре с более дохлым вторым пнем, нежели атом). Ладно присоветуйте мне ноут, есть разница для меня между intel'вским 3000 встроенным видео и 540gt? Или при условии отсутствия разницы для хорса лучше взять с более шустрым процем и встроенным видео?

А пока я так понимаю есть смысл экспериментировать с шейдерами 1.0 ?

Шейдер морф, на глаз похож на умножение координат вершин на соs^2(f(x)+time) или нечто похожее :)

moka 30.06.2011 15:27

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

maxturbo 30.06.2011 15:55

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

Сообщение от dsd (Сообщение 193778)
Я походу скоро к вижуал студии деградирую >_<

Если дойдешь до VisualStudio и API DirectX то тогда вообще будет все понятно как это работает, все эти матрицы, шматрицы и т. д. :)

moka 30.06.2011 16:03

Ответ: Имитация водной поверхности.
 
Только это не "деградация", а развитие.

dsd 30.06.2011 18:04

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


Зачем матрицы по четыре элемента в ряду имеют? Что четвертый в визуальном смысле значит? И вот допустим в соответствующей ячейке стоит интересующая меня буква, то чтобы получить эту букву я должен просто найти определитель матрицы этого элемента? Это и будет сей параметр? Пардон за тупость, но последний раз с матрицами я работал в 2002 и 2003 году. А книжку по линейной алгебре я тогда только в папке носил, читать брезговал :( Вот это мне поможет?
Что из алгебр из этого списка читать?http://eqworld.ipmnet.ru/ru/library/...cs/algebra.htm

moka 30.06.2011 18:41

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

dsd 30.06.2011 18:45

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

moka 30.06.2011 19:24

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

dsd 30.06.2011 19:37

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

Мало знать о многом, походу вредно :)

moka 30.06.2011 20:28

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

Насчёт матриц, не совсем. Ну тут относительно, порой и нужно делать что-то. Например для проекции текстуры на окружение подобие фонарика например, то тут нужно воспользоваться матрицей проекции, но по сути знать как она устроена, и не обязательно, главное знать как она работает и что нужно с ней делать, а внутрянка - это второстепенное :)

Насчёт матриц, также. Нужно понимать чем является положение пикселя или вершины в представлении шейдера. И знать как переводить их в мировые координаты (3D), или как получить их координаты на экране (2D). Но это снова, матрицы задействованы, но не нада знать как реализованы, главное научиться пользоваться ими, и знать ожидаемый результат.

Я не "гуру", мне ещё ой как много чего предстоит изучать и изучать. Да и знания - это меньшая состовляющая успешного программиста. Важнее способности. И всё это бесполезно без корректной философии и психологии самого программиста. Иметь способности, и не иметь мотивации - это слабо и ужасно :(

dsd 30.06.2011 22:21

Ответ: Имитация водной поверхности.
 
Я с вас не могу.
Просил редактор с подсветкой синтаксиа hlsl

молчаниё.

Текстовый редактор http://pnotepad.googlecode.com/files..._multilang.exe
Модуль для подсветки http://pnotepad.googlecode.com/files/hlsl.scheme
2 с копейками метров.
родная справка http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

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

Я понимаю телепаты в отпуске, но, блин, вы как Моисеи :-D


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

Mr_F_ 30.06.2011 22:33

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

Терь по делу, а из шейдера в движок данные передаются?
никак. за исключением - отрендерить в текстуру и перекачать её в ОЗУ. но это дико медленно.

dsd 30.06.2011 22:45

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

moka 30.06.2011 23:30

Ответ: Имитация водной поверхности.
 
dsd, здесь ни кто, ни кому, ничего не обязан.
То что ты нашёл ответы на свои вопросы сам - это круто, больше знаний и опыта приобрёл, нежели если бы получил ответы от кого-то.
Да и подобный способ "ворчания", ради "показухи", говорит лишь о молодости как программиста - для тебя это ново, и нужно мнение окружающих. Весьма естественно для многих начинающих, но смотри, чтобы потом, когда внимание окружающих уже не будет так доставлять, чтобы ты не загнулся в этой деятельности..

dsd 30.06.2011 23:43

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

Но за идейку с шейдерами спасибо, хороша.

HolyDel 01.07.2011 00:41

Ответ: Имитация водной поверхности.
 
четвертый стобец (строка) обычно вида 0 0 0 1. он нужен в финальном аккорде расписанном Mr_f-ом. при домножении на матрицу проекции. тогда там в конце будет не 1-ца а число - грубо говоря показывающее как далеко находится zFar от камеры. на него потом делятся позиции по координатным осям x и y для того чтобы пиксели выводились в единичном кубе. потом етот куб расширяется вьюпортом до нужного параллелипипеда (расширяются только x,y оси)

dsd 01.07.2011 01:39

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

Сделал генератор меша для воды, теперь можно настраивать детализацию ^_^ по непонятной причине фпс при равных полигонах вырос. Вместо 68-72 75-78.
Код:

supermesh=xCreateMesh()
surf=xCreateSurface(supermesh)
maxi=40
maxd=26
For i=0 To maxi
y#=0.45*i*i
x0#=-y
dx#=2*y/maxd
For d=0 To maxd
xAddVertex(surf,y,0,x0+dx*d,i,d)
Next
Next
qvert=xCountVertices(surf)
For i=0 To maxi-1
For d=0 To maxd-1
v0=i*(maxd+1)+d
v1=v0+1
v2=i*(maxd+1)+maxd+1+d
v3=v2+1
If v3<qvert Then
xAddTriangle (surf,v0,v1,v2)
xAddTriangle (surf,v1,v3,v2)
EndIf
Next
Next
xRotateMesh supermesh,0,135,0
watermesh=supermesh


dsd 01.07.2011 03:45

Ответ: Имитация водной поверхности.
 
Толи баг, толи фича.
Если в команду xVertexCoords surf,i,x00,z01,y00
вместо нормальной поверхности по ошибке воткнуть идэнтити этой поверхности, то вместо мава падает.:)

Хмм.

HolyDel 01.07.2011 13:57

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

Если в команду xVertexCoords surf,i,x00,z01,y00
вместо нормальной поверхности по ошибке воткнуть идэнтити этой поверхности
в нормальных языках (со строгой типизацией или, еще лучше, с ООП дизайном) будет вообще ошибка компиляции

dsd 01.07.2011 18:19

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

Написал первый эскиз бесконечного террэйна :)
Код:

Include "xors3d.bb"
Global pivot,camera,mxs#,mys#,Light,watertex,watermesh,terrain
Dim waterplane#(0,0)
Dim TerrainData#(0,0)
Dim heightmap#(0,0)
xGraphics3D(600,400, 32,0, 0)


 watermesh=CreateTrianMesh(20,50,0.35)
preparations()
watertex=xLoadTexture("maps/water.jpg")
xEntityTexture (watermesh,watertex)


terrain=CreateTrianMesh(50,50,0.15)
 terraintex=xLoadTexture("maps/Rockwall_Diffuse.jpg")
xEntityTexture (terrain,terraintex)
prepareterraindata()


While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))

EndlessTerrain(10)
GrimMagicWater(watermesh,3,6,10,Rnd(0.05,0.08),1)

xUpdateWorld
xRenderWorld()
Control(3.2,1)
xText 200,300,terraindata#(Rand(0,200),0)
        xFlip()
Wend

End

Function endlessterrain(gridsize#)
xPositionEntity (terrain,xEntityX(camera,1),0,xEntityZ(camera,1))
xRotateEntity (terrain,0,xEntityYaw(camera,1)-45,0 )

surf=xGetSurface(terrain,0)
qvert=xCountVertices(surf)
For i=0 To qvert-1
x00#=terraindata(i,0)
y00#=terraindata(i,2)
xTFormPoint x00,0,y00,terrain,0
x01#=xTFormedX()
y01#=xTFormedZ()
;так  имею
v0=Int(x01/gridsize#)
v1=v0+1
u0=Int(y01/gridsize#)
u1=u0+1
If (v0>=0 And u0>=0) And (v1<=255 And u1<=255) Then
v01#=heightmap#(v0,u0)
v11#=heightmap#(v1,u0)
v21#=heightmap#(v0,u1)
v31#=heightmap#(v1,u1)
dx#=x01/gridsize-v0
dy#=y01/gridsize-u0
dx1#=-(V01-V11)*dx
dx2#=-(V21-V31)*dx
virtvert1#=v01+dx1
virtvert2#=v21+dx2
z01#=virtvert1+(virtvert2-virtvert1)*dy
Else
z01#=0
EndIf
xVertexCoords surf,i,x00,z01,y00
xVertexTexCoords surf,i,x01/15,y01/15

Next
xUpdateNormals terrain
End Function



Function  GrimMagicWater(meshid,waveheight#,horizwave#,wavelength#,Noiseamplitude#,speed#)
xPointEntity light,camera
xPositionEntity (light,225*Sin(xMillisecs()/30),145,225*Cos(xMillisecs()/30))
xPositionEntity (watermesh,xEntityX(camera,1),0,xEntityZ(camera,1))
xRotateEntity (watermesh,0,xEntityYaw(camera,1)-45,0 )
If xEntityY(camera,1)<1 Then xPositionEntity camera,xEntityX(camera,1),1,xEntityZ(camera,1),1
xScaleTexture watertex,1+Sin(xMillisecs()/100)/10,1+Cos(xMillisecs()/50)/10
;wavelength#=10 ; меньшее значение означает большую длину
wavehorizlength#=35
time#=xMillisecs()*speed
mesh=meshid
meshsurf=xGetSurface(mesh,0)
qvert=xCountVertices(meshsurf)
For i=0 To qvert-1
x000#=waterplane#(i,0)
y000#=waterplane#(i,2)
z000#=0
xTFormPoint (x000,z000,y000,mesh,0)
x00#=xTFormedX()
y00#=xTFormedZ()

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)
xTFormPoint (x01,z01,y01,0,mesh)
xVertexCoords meshsurf,i,xTFormedX(),xTFormedY(),xTFormedZ()
xVertexTexCoords meshsurf,i,x00/25,y00/25
Next
xUpdateNormals mesh
End Function

Function preparations()
pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light = xCreateLight()

mesh=watermesh
surf=xGetSurface(mesh,0)
qvert=xCountVertices(surf)
Dim waterplane#(qvert,3)
For i=0 To qvert-1
waterplane#(i,0)=xVertexX(surf,i) ;x
waterplane#(i,1)=xVertexY(surf,i) ;x
waterplane#(i,2)=xVertexZ(surf,i) ;x
Next

Return watermesh
End Function

Function CreateTrianMesh(maxd,maxi,zqual#)
supermesh=xCreateMesh()
surf=xCreateSurface(supermesh)
For i=5 To maxi+5
y#=zqual#*i*i
x0#=-y
dx#=2*y/maxd
For d=0 To maxd
xAddVertex(surf,y,0,x0+dx*d,i,d)
Next
Next
qvert=xCountVertices(surf)
For i=0 To maxi-1
For d=0 To maxd-1
v0=i*(maxd+1)+d
v1=v0+1
v2=i*(maxd+1)+maxd+1+d
v3=v2+1
If v3<qvert Then
xAddTriangle (surf,v0,v1,v2)
xAddTriangle (surf,v1,v3,v2)
EndIf
Next
Next
xRotateMesh supermesh,0,135,0

Return supermesh
End Function


Function prepareterraindata()
mesh=terrain
surf=xGetSurface(mesh,0)
qvert=xCountVertices(surf)
Dim TerrainData#(qvert,3)
For i=0 To qvert-1
TerrainData#(i,0)=xVertexX(surf,i) ;x
TerrainData#(i,1)=xVertexY(surf,i) ;x
TerrainData#(i,2)=xVertexZ(surf,i) ;x
Next

;делаю карту высот
Dim heightmap#(256,256)
For x=0 To 255
For y=0 To 255
heightmap#(x,y)=15*Sin(24*x)+14*Cos(9*y); (x,y);Rnd(-3.3,0.3); высота террэйна будет колебаться в этих пределах
Next
Next
End Function

Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
        xText(10, 10, "FPS: " + xGetFPS())       
                xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEntityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function


dsd 02.07.2011 00:27

Ответ: Имитация водной поверхности.
 
http://denull.ru/terrain.htm медитировал на это. Если избавится от "дребезга" поверхности будет уже интересно :)

dsd 02.07.2011 17:54

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

Пересадил на блитз "Алгоритм «diamond-square» для построения фрактальных ландшафтов" Потратил шесть часов на отладку неправильного метода, написал правильный за 20 минут. Я дебил или теперь так будет всегда?

Уважаемые знатоки, какого демона, этот шайтан код на основе рандомных значений рисует одну и туже картинку :''((
PHP код:

Graphics3D 536,536,0,2
SetBuffer BackBuffer
()
Print 
"some kind of log"

Global xelements,yelements,maxd,img,h#

SeedRnd=MilliSecs()
z=Rand(20,4500)
xelements=512
yelements
=512
While  Not z=Or KeyHit(1)
maxd=maxd+1
z
=xelements Shr maxd
Wend
maxd
=maxd-1
Print "number of repetitions: "+maxd

Dim heightmap
#(xelements,yelements,2)
heightmap#(0,0,0)=Rnd(-5,5)                                                 heightmap#(0,0,1)=1
heightmap#(xelements-1,0,0)=Rnd(-5,5)                            heightmap#(xelements-1,0,1)=1
heightmap#(0,yelements-1,0)=Rnd(-5,5)                            heightmap#(0,yelements-1,0)=1
heightmap#(xelements-1,yelements-1,0)=Rnd(-5,5)        heightmap#(xelements-1,yelements-1,0)=1

h00#=heightmap#(0,0,0)
h10#=heightmap#(xelements-1,0,0)
h01#=heightmap#(0,yelements-1,0)
h11#=heightmap#(xelements-1,yelements-1,0)


For d=maxd To 0 Step -
For x0=0 To xelements-1
For y0=0 To yelements-1

    bz
=2^(d-1) ;&#242;åêóùèé ðàäèóñ âîêðóã òî÷êè
    
            
; &#242;åïåðü ãðàíèöû ìàññèâà íåíàðóøàåìû â ïðèíöèïå.
            
x000=Abs((x0-bzMod xelements)
            
y000=Abs((y0-bzMod yelements)
            
x001=Abs((x0+bz)Mod yelements)
            
y001=Abs((y0+bz)Mod yelements)            
            
x002=Abs((x0+bz-1)Mod yelements)
            
y002=Abs((y0+bz-1)Mod yelements)
            ; &
#226;åðøèíû â óãëàõ êâàäðàòà ñîäåðæàùåãî òî÷êó â öåíòðå
            
If heightmap#(x000,y000,1)=1 x00#=heightmap#(x000,y000,0)
            
If heightmap#(x001,y000,1)=1 x01#=heightmap#(x001,y000,0)
            
If heightmap#(x000,y001,1)=1 x10#=heightmap#(x000,y001,0)
            
If heightmap#(x001,y001,1)=1 x11#=heightmap#(x001,y001,0)
            
;&#239;ðîâåðÿþ âåðøèíû íà âàëèäíîñòü çíà÷åíèé
            
If heightmap#(x001,y001,1)=1 And heightmap#(x000,y001,1)=1 And heightmap#(x001,y000,1)=1 And heightmap#(x000,y000,1)=1 Then
                
;&#229;ñëè ïðîâåðêà âûïîëíèëàñü ðèñóþ òî÷êè åñëè â âàëèäíîì ñëîå 0
                
If Not heightmap#(x0,y0,1)=1 heightmap#(x0,y0,0)=(x00+x01+x10+x11)/4+1.44*bz*Rnd(-0.2,0.2)
                
If Not heightmap#(x000,y0,1)=1 heightmap#(x000,y0,0)=(x00+x10)/2+bz*Rnd(-0.1,0.1)
                
If Not heightmap#(x001,y0,1)=1 heightmap#(x001,y0,0)=(x01+x11)/2+bz*Rnd(-0.1,0.1)
                
If Not heightmap#(x0,y000,1)=1 heightmap#(x0,y000,0)=(x00+x01)/2+bz*Rnd(-0.1,0.1)
                
If Not heightmap#(x0,y001,1)=1 heightmap#(x0,y001,0)=(x11+x10)/2+bz*Rnd(-0.1,0.1)
                
;&#240;èñóþ ïî 1 ñëîþ âàëèäàòîðû
                
heightmap#(x0,y0,1)=1
                
heightmap#(x000,y0,1)=1
                
heightmap#(x001,y0,1)=1
                
heightmap#(x0,y000,1)=1
                
heightmap#(x0,y001,1)=1
                        
            
EndIf
        

Next 
Next 
Print Abs((d-maxd)*100/maxd)+"%      "+(xelements-1)Mod (1 Shl d) + "      " bz
Next
Print "Array is ready"

MakeImage()



While 
Not  ((KeyDown(56) And KeyHit(62)) Or  (KeyHit(56) And KeyDown(62))  Or KeyHit(1))

UpdateWorld
RenderWorld
ClsColor 0
,75,151
Cls
DrawImage img
,12,12

;Text 200,400,17 Mod (1 Shl 8)
;
Text 200,420,hmin+"     "+hmax

Text 0
,0,1 Shl 8
Flip
Wend
End

Function MakeImage()
Print 
"Making image"
;&#227;ðàôè÷åñêîå îòîáðàæåíèå ìîåãî ìàññèâà
hmax#=0
hmin#=0
For x=1 To xelements 
For y=1 To yelements 
x0
=x-1
y0
=y-1
If heightmap#(x0,y0,0)>hmax Then hmax=heightmap#(x0,y0,0)

If heightmap#(x0,y0,0)<hmin Then hmin=heightmap#(x0,y0,0)
Next 
Next 

h
#=hmax-hmin
Print h+"   Begin of building image"
img=CreateImage(xelements,yelements)
SetBuffer ImageBuffer(img)
ClsColor 255,0,0
Cls
For x=1 To xelements 
For y=1 To yelements 
x0
=x-1
y0
=y-1
d
=255*(heightmap#(x0,y0,0)-hmin)/h#

;If x0>xelements/2 Then d=Rand(0,255) ; for viewing regular noisejust to find is there any difference or not
Color d
,d,d
;If heightmap#(x0,y0)=0 Then Color 127,127,255 ;for showing sea level

Plot x0,y0

Next 
Next 
SetBuffer BackBuffer
()
;
ScaleImage img,4,4
;&#234;îíåö ñîçäàíèÿ ãðàôè÷åñêîãî ïðåäñòàâëåíèÿ ìàññèâà
End Function 


Program23 02.07.2011 18:00

Ответ: Имитация водной поверхности.
 
Я убрал знак равенства между SeedRnd MilliSecs() и у меня вроде бы работает)

dsd 02.07.2011 18:02

Ответ: Имитация водной поверхности.
 
Фух, хотел заново переписывать :-D

Вроде мой первый действительно полезный код :)

Program23 02.07.2011 18:06

Ответ: Имитация водной поверхности.
 
Вложений: 1
Нашел баг.
Кажется, генератор не дорисовал картинку)
Вложение 14264

dsd 02.07.2011 18:07

Ответ: Имитация водной поверхности.
 
Не это я на высоте 0 отметку даю таким цветом :) В той точке ровно ноль :)

А, я не могу, оно оказывается еще и бесшовную текстуру рожает :-D.

dsd 02.07.2011 21:07

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

Второй эскиз террэйна.

dsd 03.07.2011 18:45

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

PHP код:

//Матрицы
//xSetEffectMatrixSemantic tModel,"MatWorldViewProj",WORLDVIEWPROJ
//xSetEffectMatrixSemantic tModel,"MatWorld",WORLD
float4x4 MatWorldViewProj;
float4x4 MatWorld;

// вношу время из хорса
float time;

// Объявление переменных в данном случае вывод пиксельного шейдера
static float3 Color;
static 
float4 cD;

//Передача тестуры в шейдер
//xSetEffectTexture tModel,    "InShaderTextureName",texDiffuse
const texture InShaderTextureName;            
sampler TexDiffuse=sampler_state //тут я говорю что текстура Diffuse типа
    
Texture   = <InShaderTextureName>;
   };


//######  Ввод в вершинный шейдер  ##################
struct VertexShaderInput {
   
float4 Position POSITION0;     // мировая позиция вершины
   
float3 Normal NORMAL;            // нормаль к этой вершине
   
float2 TexCoords TEXCOORD0;     // координаты точки на текстуре
};
//#  Вывод вершинного шейдера = ввод пиксельного  ###
struct PixelShaderInput {
    
float4 Position POSITION0;    //новая мировая позиция вершины
    
float4 pWorld TEXCOORD0;
    
float3 Normal TEXCOORD1;
    
float2 TexCoords TEXCOORD2;
};


//вершинный шейдер
void NameOfVertexShaderFunctionin VertexShaderInput INout PixelShaderInput OUT ) {
    
//OUT.Position    = mul((mul(IN.Position,MatWorldViewProj)),cos(time));
    
[b]OUT.Position    mul(IN.Position,MatWorldViewProj)*cos(time);[/b]
    
OUT.pWorld        mul(IN.Position,MatWorld);
    
OUT.Normal        normalize(mul(IN.Normal,MatWorld));
    
OUT.TexCoords    IN.TexCoords;
}

//пиксельный шейдер
float4 NameOfPixelShaderin PixelShaderInput IN ) : COLOR {
    
cD            tex2D(TexDiffuse,IN.TexCoords);
    
Color        cD.rgb;    
    return 
float4(Color,cD.a);
}


//##################  Technique  ##################
// здесь расположен проход этот кусок заставляет исполняться шейдер
//xSetEffectTechnique tModel,"TechniqueName"
technique TechniqueName {
    
pass p0 //проход рендера их может быть несколько с разными шейдерами
        
AlphaBlendEnablefalse;
        
vertexshader    compile vs_2_0 NameOfVertexShaderFunction(); 
        
pixelshader        compile ps_2_0 NameOfPixelShader();
    }


Но вместо плавного морфинга получилось моргание меша, на который применен мой чудо шейдер, это от того что в float4 Position : POSITION0; есть еще и W и умножение на синус и дает такой чудный эффект моргания?

dsd 03.07.2011 21:19

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

рэвин хорстридэ и начинающий его юзер

h1dd3n 04.07.2011 03:10

Ответ: Имитация водной поверхности.
 
Эммм дак ты нифига себе че делаешь то)) Ты сначала умножаешь координаты вертекса на ввп матрицу, а ПОТОМ умножаешь на косинустайм. Есстественно на экране будет ппц что...
Тебе надо сначала умножить координаты так как хочешь, а потом уже умножать на матрицу.
Примерно так:
Код:

v2f o;

float CosTime = (cos(_Time.y) * 0.5 + 0.5);
o.pos = v.vertex;
o.pos.xyz = o.pos.xyz * CosTime;
o.pos = mul(UNITY_MATRIX_MVP, o.pos);
                                       
return o;

_Time.y это то что у тебя просто time.

HolyDel 04.07.2011 12:47

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

POSITION0; есть еще и W и умножение на синус и дает такой чудный эффект моргания?
совершенно верно! яже говорил уже тебе, что на ето W будет потом делиться все остальные компоненты. меш типа увеличивается в бесконечноть? умножай только первые три компоненты, а четвертую не трож.



фу hlsl
столько лишней писанины

dsd 04.07.2011 14:01

Ответ: Имитация водной поверхности.
 
Проще разделять координаты оперируя координата.x, координата.y, координата.z или получить вектор позиции A(x,y,z,w), потом уже работать с ним? Если допустим хочу сжать модель по Z в два раза то получаю итоговый вектор В(x,y,0.5*z,w) и с ним уже имею конструкцию выводящую из вертексного шейдера: OUT.Position = mul(В(x,y,0.5*z,w),MatWorld)?
И как я понимаю в OUT.Position будет записана не координата в позиции меша, а координата вертекса относительно глобальных мировых координат сцены?

Вот это должно сжать модель по Зед, так или не так?
mul(mul(IN.Position,B(1,1,0.5,1)),MatWorld)


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

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