游戏开发论坛

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

多个VertexShader中保持光照的一致

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-6-23 16:02:00 | 显示全部楼层 |阅读模式
个人认为,其实shader还是很简单的,甚至感觉 ASM shader更简单一些。不过。。。

光照需要在 VS 中处理。而且:

(1) 你总不能仅仅用,固定管线的Light模型吧。
(2) 既然(1)不行,那么,你需要在所有的 VS 中,保持光照的一致。算法我们不说,如果,你修改了Light模型,那么,需要修改所有的 shader 文件,以适应这种改动。如果使用 ASM ,则非常非常难。

我的观点:
1 定义自己的 shader 文件。不过,你需要编写编译器。
2 不要用ASM,而要用HLSL, 而且,对于光照,要单独写一段全局性的代码,
  然后,在引擎中合并 光照(全局的) 和 变换(私有的) 代码。
3 无论如何,应尽量制定一个Light的数据结构,以后尽可能不要改动。

可以说。。。因为这个原因,我对shader的研究,停止了 1 个月。当然我不可能光搞图形。
还有个原因是,不用 ID3DXEffect9, 使用 hlsl,比较麻烦,包装个自己的类也要花一些功夫。  

我想听听各位大虾的意见。

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-6-23 20:25:00 | 显示全部楼层

Re:多个VertexShader中保持光照的一致

想实现光照的完全一致几乎是不可能的事情,现在的游戏渲染那么复杂,很多材质的照明算法都完全不相同,从完全预计算的光照图到半预计算的PRT,再到完全动态计算的全局环境照明,更不要提环境映射和大气散射这种准光照计算了。这些千变万化的东西怎么可能用一个大统一模型来表示呢?何况这些计算还需要很多中间数据,数据之间又互相耦合……就算是用光线跟踪,也必须对一些具有代表性的材质做专门设定,更不要说是实时游戏了。
对不同材质的物体使用不同的Shader是必须的,关键在于如何将场景中可能出现的物体材质归类,总结初一些具有较强包容性的材质

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-6-23 21:39:00 | 显示全部楼层

Re: Re:多个VertexShader中保持光照的一致

jk20012001: Re:多个VertexShader中保持光照的一致

想实现光照的完全一致几乎是不可能的事情,现在的游戏渲染那么复杂,很多材质的照明算法都完全不相同,从完...

没错,根据我目前的实践表明,确如楼上所说。 [em9]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-23 23:30:00 | 显示全部楼层

Re:多个VertexShader中保持光照的一致

呵呵,我个人,倒是想随性子来,怎么漂亮怎么画模型。
不过,玩家可能不会认同,比如,2个模型上的光线方向明显不同。。。

我说的意思啊,仅仅是,  光  的数据结构。而不是光照过程或材质。
前者(光线参数)应当尽量不要改动。。。最起码要在游戏中设置个全局变量。。。
后者(光照的计算过程)?当然要用不同的shader啦,因为材质不同,光所表现出来的效果不同。

PS.光照图,姑且不讨论之。。。既然要使用光照图,估计这些物体的光照方向是不变的,那还麻烦什么,
就不考虑他们的光照了。反正光照图是垃圾PC用的。既然PC垃圾,也不管他什么“一不一致”了

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-23 23:33:00 | 显示全部楼层

Re: Re:多个VertexShader中保持光照的一致

wjk98550328: Re:多个VertexShader中保持光照的一致

把光照计算写几个函数,放在一个独立的文件xx.hlsl中,然后各个效果#include"xx.hlsl"就可以了。。。


555~~用过ASM写过个东西,宏都没有使用,自己查找替换的。
写完后发现,ASM没有办法轻松实现光照的一致

2

主题

683

帖子

687

积分

高级会员

Rank: 4

积分
687
发表于 2008-6-24 05:26:00 | 显示全部楼层

Re:多个VertexShader中保持光照的一致

光照图可不是只有垃圾pc使用。unreal3中,光照图是最基本的。所有静态光源和静态物体的作用都会产生预先生成的光照贴图。静态光源只对静态物体发生作用,动态光源对静态物体和动态物体都可以发生作用。这样处理对性能的优化很大。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-24 12:27:00 | 显示全部楼层

Re: Re:多个VertexShader中保持光照的一致

wildfire: Re:多个VertexShader中保持光照的一致

光照图可不是只有垃圾pc使用。unreal3中,光照图是最基本的。所有静态光源和静态物体的作用都会产生预先生成...


呵呵,是啊,能节约就要节约。
此外我感觉,室外的白天,可以不出理角色的光照,因为太阳光是均匀的。。。
至于那个什么“一致的光照”,我打算用自定义shader文件来解决。

shading分为3个部分:
1 全局的光线参数--在程序中定义
2 模型的skin文件--包含map,和材质参数
3 模型的shader文件--处理光线,map,材质
(不同的shader文件无法改变光线参数,只能改变光照效果)

18

主题

211

帖子

419

积分

中级会员

Rank: 3Rank: 3

积分
419
发表于 2008-6-25 08:32:00 | 显示全部楼层

Re:多个VertexShader中保持光照的一致

顶一下,,,学习学习!!!

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-6-25 12:02:00 | 显示全部楼层

Re:多个VertexShader中保持光照的一致

原来你是这个意思,那可以在一个h文件中定义几个常量寄存器号和值表示光源的属性,然后每个Shader都Include这个h,如果你的光源不会动态改变的话,这样可能是最简便的方法了
PS:在室外场景中太阳光怎么会是均匀的呢?通常是当作一个方向光处理,除了太阳光之外,环境光也不可能是均匀分布的,否则在阴天下雨的时候,去掉了太阳方向光源,那场景中任何物体表面的光照岂不是都一样了吗?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-25 13:10:00 | 显示全部楼层

Re: Re:多个VertexShader中保持光照的一致

jk20012001: Re:多个VertexShader中保持光照的一致

原来你是这个意思,那可以在一个h文件中定义几个常量寄存器号和值表示光源的属性,然后每个Shader都Include...


呵呵,您说的,比我想的方法,更“近”了一步。
之前我没有想到,统一定义常量寄存器号。。这样 ASM 就更方便,更统一了。

PS.我的意思是,太阳光会产生阴影,这是作为方向光源处理的,
但是,照明效果,可以认为是均匀的,所以,可以不考虑Diffuse光照,
而只要处理高光
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 04:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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