游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3105|回复: 9

一个渲染问题

[复制链接]

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
发表于 2007-1-24 11:36:00 | 显示全部楼层 |阅读模式

问题是,在一条渲染队列中,实现交叉混合,交叉透明。


这个问题我早在去年就想拿出来问一下了。因为描述有点麻烦,如果要表达更形象,我还要做些demo的效果的图才行。

效果图我在今天搞定了不规则的gui window,和相框以后再做。我先描述一下问题。

模型1=A
模型2=B

A用0.5的透明纹理,B也用0.5的透明纹理。
A和B在同一个坐标上,不使用ZBuffer,或则说,deathmask状态是假。

然后在一条渲染队列中,
最后得到A的效果是,A中间可以看见B
最后得到B的效果是,B中间可以看见A

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2007-1-24 15:06:00 | 显示全部楼层

Re:一个渲染问题

如果我没理解错的话,我想你说的是real time的PRT?

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2007-1-25 11:19:00 | 显示全部楼层

Re: 一个渲染问题

我再说一下,是一条渲染队列。

这是正确的结果,来自3dsmax
两张相同,带A通道的纹理,被两个面片分别交叉,交叉渲染得结果是正确的
sf_2007125111850.jpg

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2007-1-25 11:21:00 | 显示全部楼层

Re: 一个渲染问题

这是正确的渲染结果,
sf_2007125112040.jpg

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2007-1-25 11:27:00 | 显示全部楼层

Re: 一个渲染问题

这就是问题所在了。

可以做一下实验,在一条渲染队列中,渲染交叉模型,只有一个交叉的,另一个没有交叉源。

想了很久,一直没找到好的解决办法。


//
tarkey能否详细说明一下关于RT-PRT?或则直接告诉我解决办法。

sf_2007125112654.jpg

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-1-25 12:50:00 | 显示全部楼层

Re:一个渲染问题

根据alphablend需要之前在framebuffer上的颜色信息
所以通常我们会先按从近到远的顺序画不通明物体
然后再按从远到近的顺序画透明物体
这样才能得到正确的效果

对于可能出现透明包透明的处理(通常这是应该从制作上避免的)
为保证正确的效果,简单的处理方法是
可以先从远到近,裁减正面(只画背面)
再从远到近,裁减背面(只画前面)

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-1-25 12:52:00 | 显示全部楼层

Re:一个渲染问题

有一个算法可以不需要排序也能正确渲染三角形。

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2007-1-25 16:08:00 | 显示全部楼层

Re:一个渲染问题

楼上说的算法是?如果没有第二个缓冲,我想应该没有除排序外别的办法能真实地模拟交叉的alphaBlend啊

楼主遇到的问题和在没Z-buffer之前的背面剔除算法一样…画家算法在这儿栽了…然后用BSP算法来弥补这个缺陷。

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2007-1-27 12:11:00 | 显示全部楼层

Re: Re:一个渲染问题

千里马肝: Re:一个渲染问题

根据alphablend需要之前在framebuffer上的颜色信息
所以通常我们会先按从近到远的顺序画不通明物体
然后再...


不行的。模型是双面。使用的非faceculling。使用非facecull就没有正面和背面的概念了。

交叉透明,如果先反后正的渲染。不行的,覆盖不了前一个。因为覆盖前一个的时候,透明了,但前一个没有透明。

8

主题

553

帖子

560

积分

高级会员

Rank: 4

积分
560
发表于 2007-1-27 14:02:00 | 显示全部楼层

Re:一个渲染问题

其实这就是一个OIT(order independent transparency)的问题,只是楼主的叙述太令人生畏了。。。
这个问题没有什么好方法能够解决。假如所有的面都不相交,那么需要排序,排序算法是nlog级别的,显然不适合现有图形硬件。用depth peeling需要画多次,实际应用中一般做到4层就可以了(比如unreal 3里就只做到4层),但半透明物体多时,重绘的开销也不小。
可以想象unreal 3这样的游戏都只做了4层,一般的游戏最多也就是用马马说的那种方法了。

问题的根源在于现有图形硬件没有一种层次的数据结构,也就是没法把一次渲染过程中,最近的pixel, 次近的,第三近的。。。以一种方式存下来,而只能存最近的pixel的信息。

至于prt,应该和楼主的问题时风马牛不相机。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 08:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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