游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5719|回复: 16

请问,在DX中如何直接或间接获取深度值(渲染水时遇到

[复制链接]

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
发表于 2009-1-16 13:49:00 | 显示全部楼层 |阅读模式
要表现水的深浅效果,必须在投影后,知道水底河床的深度 Dt, 从而,用当前渲染的水的网格的深度 Dw - Dt 得到水到河床的距离,从而表现水的透明度随深浅变化的效果


能不能不用多一个 pass 来将地形(河床)的深度渲染到一张 32F 的贴图上,比如直接拷贝当前已有的深度缓冲到一张贴图?或者其他方法?

在现在这个项目中,用的是DX,后备缓冲格式是 R8G8B8X8,深度缓冲是 Z24S8。

请各位高手支招啊,谢谢


另外,先前最开始尝试的方法是:
在垂直水面方向,遍历水面网格的顶点,记为 Pw,用其 z 值减去其竖直向下对应的地形网格顶点的 z 值,如: depth = Pw.z - Pt.z;

然后将 depth 存到水网格的 w 分量中, Pw.w = depth,通过这种方式传到 shader 中,然后
在顶点 Shader 中:
OUT.depth = Pw.w;
Pw.w = 1.0; // w 位只是借用存一下高度

在像素 Shader 中:
OUT.col.a = clamp( 0.0f, 1.0f, IN.depth );

这样就可以表现岸边到水深为1米的这段区域里,alpha 值从0开始往1递增,但是,这个深度是和摄像机朝向相关的,只有摄像机垂直向下才是正确的,当摄像机斜着看过去深度值就是错位的(此时,正确的深度应该是摄像机在水面和地形之间逐顶点或逐像素做射线碰撞,得到的距离,但这样性能消耗应该比多一个PASS还大)。


还有,论坛上有朋友说,将上面提到的垂直深度值预渲染到一张 alpha 纹理上,然后传进 shader。可能是我没理解到,这有两种理解方式:
1. 该 alpha 图用在渲染水网格的时候(那么,会遇到跟上面一样的摄像机朝向相关的问题,不知如何解决?)
2. 该 alpha 图用在渲染地形的时候(也就是将其渲染在地形上,这里至少就存在两个问题:首先是地形上不仅存在水一种类型的物体,改变了其alpha值在渲染其他物体时会不会出错?另外一个问题是水的深度在逻辑上是由水决定的,其深度的处理应该由水的渲染逻辑来处理,而不是地形)


整理一下思路,现在本人知道的方法有两种:
1. 在渲染水时,在像素 shader 中与当前深度缓冲中的深度值做减法,得到的 deltaDepth * ( farPlane - nearPlane ) 就是深度。但问题是,在DX中不知如何廉价的得到深度缓冲的值

2.在地图加载时,垂直的将水深逐顶点保存在水网格中/或者渲染到一张贴图中,然后在 shader 中转换成透明值进行处理。(问题是,该深度是和摄像机朝向密切相关的,只有垂直朝向才是正确的,其他朝向,深度都是错位的)


可能是已经走入了死胡同,实在是找不到解决方法了,请各位给点思路,不吝赐教,谢谢。 [em1]

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
 楼主| 发表于 2009-1-16 13:57:00 | 显示全部楼层

Re: 请问,在DX中如何直接或间接获取深度值(渲染水时遇

以上说到的预计算垂直高度的方法,运行效果截图

这个图是摄像机垂直向下,“正确”的结果
sf_200911613574.jpg

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
 楼主| 发表于 2009-1-16 13:59:00 | 显示全部楼层

Re: 请问,在DX中如何直接或间接获取深度值(渲染水时遇

以上说到的预计算垂直高度的方法,运行效果截图

这个图是摄像机非垂直向下的时候,错误的结果
sf_2009116135848.jpg

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-1-16 15:19:00 | 显示全部楼层

Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇

要得到正确的深度,必须相机朝下渲染深度图,然后再用正常相机位置渲染水。而且深度图的范围需要能覆盖当前相机所能看到的所有水表的范围。总的来说,这种方法非常不划算。

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
 楼主| 发表于 2009-1-16 15:35:00 | 显示全部楼层

Re: Re:请问,在DX中如何直接或间接获取深度值(渲染水时

qrli: Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇到的障碍)

要得到正确的深度,必须相机朝下渲染深度图,然后再用正常相机位置渲染水。而且深度图的范围需要能覆盖当前相机所能看到的所有水表的范围。总的来说,这种方法非常不划算。


对,这样做不够简单,处理起来比较麻烦~

想在摄像机视角预渲染一张地形的深度图到一张F32的纹理中,但多一个pass,不划算啊

有没有不要多一个pass的解决方法啊,比如,直接拷贝深度缓冲到纹理?DX上可行不?

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-1-16 21:00:00 | 显示全部楼层

Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇

你的深度缓冲无论如何也得是竖直向下的相机渲染出来的,取深度缓冲做纹理不也得多一个pass么

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
 楼主| 发表于 2009-1-16 22:12:00 | 显示全部楼层

Re: Re:请问,在DX中如何直接或间接获取深度值(渲染水时

qrli: Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇到的障碍)

你的深度缓冲无论如何也得是竖直向下的相机渲染出来的,取深度缓冲做纹理不也得多一个pass么


竖直向下渲染的深度缓冲,跟摄像机相关啊

渲染水的时候,只有当摄像机是垂直的这种情况,水的深度才对的上

当摄像机斜着朝水面看过去的时候,各处的深度值就和垂直渲染出来的深度缓冲中的不对应了

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2009-1-16 23:42:00 | 显示全部楼层

Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇

我也很好奇,OpenGL倒是有这个功能。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-1-17 11:49:00 | 显示全部楼层

Re: Re:请问,在DX中如何直接或间接获取深度值(渲染水时

CLOD: Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇到的障碍)

我也很好奇,OpenGL倒是有这个功能。


我不是前几天刚发了个深度缓冲纹理的资料么:
http://bbs.gameres.com/showthread.asp?threadid=122181

14

主题

345

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
QQ
发表于 2009-1-17 13:00:00 | 显示全部楼层

Re:请问,在DX中如何直接或间接获取深度值(渲染水时遇

在地图编辑器里, 把透明度(水面与地面的差值)保存在顶点的颜色里
每次编辑地形就更新一下, 实际渲染时不用算的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 11:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表