引擎设计跟踪(九.14.3.3) Deferred shading的一些小细节
2016-04-03 18:45
344 查看
1.ambient light
之前的shader里面, 方向光会加上ambient 的计算. 但是如果没有方向光, 就没有ambient. 这是把全局方向光改为点光源之后发现的, 因为透明物体的forward shading是正常的, 其他的全是黑的.
解决方法: 如果没有方向光, 就专门画一个单独quad来计算ambient lighting.
2.uv flip
这个是因为DX9的纹理坐标系和OGL的相反, 而他们的屏幕坐标系却一样所导致. OGL的屏幕坐标系和UV坐标系都是向右X为正, 向上Y为正轴, 而DX9的屏幕坐标系和OGL一样, 但是UV坐标系相反, 所以render target中的内容是和正常使用贴图相比是Y反转的.
在vertex shader里面flip一下屏幕坐标就可以了.
IGraphicsManager有一个关于图像朝向的标记, 不同的API是不一样的, 这个flip的值通过CPU端计算再传入shader. 来保证API兼容.
另外, 因为现在所有光源都使用了quad, 所以可以在vertex shader 里面计算uv. 之前point light和spot light使用的volume, 因为要做perspective correction 之后才能在pixel shader里面做perspective divide( /w), 现在因为是平面, 不需要再pixel shader里面计算, vertex shader里面 /w 就可以了.
3. half pixel/texel offset
这个也是为了兼容性: 目前只有DX9需要这个trick, DX10+以及OGL都不需要. 现在在IGraphicsResourceManager里面加了一个flag, runtime做判断, 根据API的设置来确定是否要计算, 这样可以兼容所有的API.
之前的shader里面, 方向光会加上ambient 的计算. 但是如果没有方向光, 就没有ambient. 这是把全局方向光改为点光源之后发现的, 因为透明物体的forward shading是正常的, 其他的全是黑的.
解决方法: 如果没有方向光, 就专门画一个单独quad来计算ambient lighting.
//GBuffer color float2 colorUV = UV * colorUVSpace.zw + colorUVSpace.xy; float4 albedo = tex2D(colorBuffer, colorUV); #if defined(AMBIENT) return light_ambient*albedo; #endif //GBuffer normal float2 normalUV = UV * normalUVSpace.zw + normalUVSpace.xy; float4 normal = tex2D(normalBuffer, normalUV); float3 worldNormal = normalize(expand_vector(normal).xyz); #if defined(DIRECTIONAL) float4 diffuse = light_ambient;
2.uv flip
这个是因为DX9的纹理坐标系和OGL的相反, 而他们的屏幕坐标系却一样所导致. OGL的屏幕坐标系和UV坐标系都是向右X为正, 向上Y为正轴, 而DX9的屏幕坐标系和OGL一样, 但是UV坐标系相反, 所以render target中的内容是和正常使用贴图相比是Y反转的.
在vertex shader里面flip一下屏幕坐标就可以了.
IGraphicsManager有一个关于图像朝向的标记, 不同的API是不一样的, 这个flip的值通过CPU端计算再传入shader. 来保证API兼容.
scalar flip = IGraphicsResourceManager::getSingleton().getGraphicsConfig().TextureDir == IMGO_TOP_DOWN ? -1.0f : 1.0f; mViewSize[3] = flip;
另外, 因为现在所有光源都使用了quad, 所以可以在vertex shader 里面计算uv. 之前point light和spot light使用的volume, 因为要做perspective correction 之后才能在pixel shader里面做perspective divide( /w), 现在因为是平面, 不需要再pixel shader里面计算, vertex shader里面 /w 就可以了.
3. half pixel/texel offset
这个也是为了兼容性: 目前只有DX9需要这个trick, DX10+以及OGL都不需要. 现在在IGraphicsResourceManager里面加了一个flag, runtime做判断, 根据API的设置来确定是否要计算, 这样可以兼容所有的API.
scalar fHalfPixelOffsetX = 0; scalar fHalfPixelOffsetY = 0; if (IGraphicsResourceManager::getSingleton().getGraphicsConfig().HalfTexel2Pixel) { fHalfPixelOffsetX = 0.5f / (scalar)width; fHalfPixelOffsetY = 0.5f / (scalar)height; }
相关文章推荐
- No tag "datetimepicker" defined in tag library imported with prefix "s"
- The same title, but different article
- 使用butterknife zelezny插件时必须保证已导入butterKnife的库工程。
- javascript设计模式 单体模式
- JSP概述
- HTML图像
- 迷失的自我01
- POJ 1987 BZOJ 3365 USACO 2004 Feb Distance Statistics 路程统计 点分治
- 在NodeJS中玩转Protocol Buffer
- jQuery代码优化:事件委托篇
- jquery-ajax-php(内容点赞并进行cookie限制实现)
- 【javascript 】组合式继承
- JavaScript之jQuery-8 jQuery 使用插件(zTree树插件、jQuery UI插件)
- 用Beautiful Soup解析html源码
- jQuery实现图片轮播且鼠标可控制显示,使用animate函数
- 简单理解css中的垂直居中和水平居中,即vertical-align和text-align属性
- JavaScript(二)-- 面向对象
- 使用百度静态资源库bootstrap字体出现问题
- 【前端】在Gulp中使用Babel
- 深入理解letter-spacing和word-spacing2