|
3D-программирование Вопросы, касающиеся программирования 3D мира |
29.06.2011, 17:48
|
#76
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Я хочу для начала почитать по шейдерам художественную литературу. А для блитца мне захотелось сделать пак функций, для воды, террэйна, облаков, замутить какую нить растительность. Простенький лайтмап для самопального террэйна, небо и т.п.
|
(Offline)
|
|
29.06.2011, 17:53
|
#77
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Зачем делать что-то на FFP, если это уже никто не использует, и все всё делают на шейдерах?
В данном случае это не разумно..
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.06.2011, 18:24
|
#78
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Просто так. А также из соображения, что научившись делать деревянные велосипеды с квадратными колесами, еще рано приступать к проектированию мопедов.
|
(Offline)
|
|
29.06.2011, 19:06
|
#79
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Это две разные вещи, снова говорю.
Шейдеры никак не относятся к FFP - это две разные сферы реализации, и общего там почти ничего нет. Совсем разный подход. Единственное одинаково, это данные которые используешь, но это изучается и там и там.
|
(Offline)
|
|
29.06.2011, 19:17
|
#80
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Есть еще один мотив, intel gma 945 хоть и поддерживает шейдеры 3.0, но программно, и чую задом, что не полностью. А пока единственно, что осталось это чудо нетбук леново идеяпад с 10, подключенный к 28" монику .
|
(Offline)
|
|
29.06.2011, 19:30
|
#81
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Лучше начинать с шейдеров 2.0. Их ограничение по нагрузке - источник мотивации на оптимизацию и больше смекалки.
|
(Offline)
|
|
29.06.2011, 21:37
|
#82
|
Разработчик
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений (для 66 пользователей)
|
Ответ: Имитация водной поверхности.
Чуть чуть о 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 занимается преобразованием модели из пространства модели в пространство мира/вида/проекции. Он может сам генерировать текстурные координаты или менять форму самой модели, например, “пустить” волны по ровной поверхности воды или как-то изогнуть модель, провести трансформации в соответствии со скелетной анимацией, может почитать освещённость вершин модели и много чего ещё…
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо maxturbo за это полезное сообщение:
|
dsd (29.06.2011), moka (30.06.2011)
|
29.06.2011, 22:40
|
#83
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Сегодня я многому научился
Таки узнал, что команда Tform в блитце работает очень быстро, по сути это почти как умножение на одно число
Таки сделал ручной расчет нормалей, с усреднением нормали полигонов примыкающих к вершине. Это работает слегка медленней, чем updatenormals. Я чувствую себя таааакиииим умным , хотя вроде затенение выглядит сильно контрастней. Но страшней
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
Последний раз редактировалось SBJoker, 29.06.2011 в 23:52.
|
(Offline)
|
|
30.06.2011, 00:23
|
#84
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
http://developer.nvidia.com/fx-composer Что вы можете сказать об этом? Или для нуба это как дать болгарку питекантропу?
O_o, на глаз запалил ошибку в своем коде, где тформлю вместо нормали вектор.
|
(Offline)
|
|
30.06.2011, 00:29
|
#85
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Имитация водной поверхности.
Вообще такие инструменты это не очень то удобно, имхо. Но если все же хочется "удобной" среды разработки шейдеров, то лучше взять ATI RenderMonkey.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.06.2011, 00:54
|
#86
|
Разработчик
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений (для 66 пользователей)
|
Ответ: Имитация водной поверхности.
Сообщение от h1dd3n
Вообще такие инструменты это не очень то удобно, имхо. Но если все же хочется "удобной" среды разработки шейдеров, то лучше взять ATI RenderMonkey.
|
RenderMonkey самое то
__________________
|
(Offline)
|
|
30.06.2011, 02:35
|
#87
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Мне кажется или самый удобный способ производить в башке все манипуляции? А учиться шейдерам будет проще тыкая пальцем рабочий пока он не изменится предсказуемым образом?
Чето в нвидиа как в цупе О_о.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.06.2011, 02:56
|
#88
|
Разработчик
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений (для 66 пользователей)
|
Ответ: Имитация водной поверхности.
Сообщение от dsd
Мне кажется или самый удобный способ производить в башке все манипуляции? А учиться шейдерам будет проще тыкая пальцем рабочий пока он не изменится предсказуемым образом?
Чето в нвидиа как в цупе О_о.
|
Пользуйся RenderMonkey, тупо тыкать? Ммм конечно не идеальный способ... Все же лучше почитать тебе по конкретней про назначение шейдеров (вертексные и пиксельные) только тогда поймешь Где то видел книгу очень хорошую по шейдерам, там описывают работу на программе RenderMonkey, поищи ее
__________________
|
(Offline)
|
|
30.06.2011, 02:59
|
#89
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: Имитация водной поверхности.
советую глянуть cg tutorial, gpu gems 1, 2, 3
|
(Offline)
|
|
30.06.2011, 03:28
|
#90
|
Разработчик
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений (для 66 пользователей)
|
Ответ: Имитация водной поверхности.
А я вот это советую
Shader
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо maxturbo за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:56.
|