1.ambient light

之前的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[] = 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 = ;
scalar fHalfPixelOffsetY = ;
if (IGraphicsResourceManager::getSingleton().getGraphicsConfig().HalfTexel2Pixel)
{
fHalfPixelOffsetX = 0.5f / (scalar)width;
fHalfPixelOffsetY = 0.5f / (scalar)height;
}

引擎设计跟踪(九.14.3.3) Deferred shading的一些小细节的更多相关文章

  1. 引擎设计跟踪(九.14.3.2) Deferred shading的后续实现和优化

    最近完成了deferred shading和spot light的支持, 并作了一部分优化. 之前forward shading也只支持方向光, 现在也支持了点光源和探照光. 对于forward sh ...

  2. 引擎设计跟踪(九.14.3.1) deferred shading: Depthstencil as GBuffer depth

    问题汇总 1.Light support for Editor编辑器加入了灯光工具, 可以添加和修改灯光. 问题1. light object的用户互交.point light可以把对应的volume ...

  3. 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复

    由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...

  4. 引擎设计跟踪(九.14.3) deferred shading 准备

    目前做的一些准备工作 1.depth prepass for forward shading. 做depth prepass的原因是为了完善渲染流程, 虽然架构上支持多个pass, 但实际上从来没有测 ...

  5. 引擎设计跟踪(九.14.2 final) Inverse Kinematics: CCD 在Blade中的实现

    因为工作忙, 好久没有记笔记了, 但是有时候发现还得翻以前的笔记去看, 所以还是尽量记下来备忘. 关于IK, 读了一些paper, 觉得之前翻译的那篇, welman的paper (http://gr ...

  6. 引擎设计跟踪(九.14.2i) Android GLES 3.0 完善

    最近把渲染设备对应的GLES的API填上了. 主要有IRenderDevice/IShader/ITexture/IGraphicsResourceManager/IIndexBuffer/IVert ...

  7. 引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio

    最近在做纹理压缩工具, 以及数据包的生成. shader编译已经在vs工程里面了, 使用custom build tool, build命令是调用BladeShaderComplier, 并且每个文件 ...

  8. 引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools

    之前骨骼动画的IK暂时放一放, 最近在搞GLES的实现. 之前除了GLES没有实现, Android的代码移植已经完毕: [原]跨平台编程注意事项(三): window 到 android 的 移植 ...

  9. 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014

    Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/ 简译 translation: 作者在2012年写 ...

随机推荐

  1. C语言的#if #ifdef #ifndef

    #if #ifedf #ifndef   —般情况下,C语言源程序中的每一行代码.都要参加编译.但有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译.此时就需要在程序中加上条件,让编译器只 ...

  2. js初学

    1.学习一门编程语言需要记住知识点:          1.关键字.     2.标识符.     3.注释.     4.运算符.     5.常量和变量 .     6.语句.     7.函数 ...

  3. python笔记26-编码规范层级目录

    bin-放的可执行文件 conf-放的配置文件 lib-放的一些lib库 temp-放的零时文件 logs-日志 core-核心逻辑 data-存放数据 README-帮助文档 start_shop. ...

  4. java 秒时间格式化

    public static String durationFormat(Integer totalSeconds) { if (totalSeconds == null || totalSeconds ...

  5. 小程序 onReachBottom 事件快速滑动时不触发的bug

    一般在列表页面 会先加载一定数量的数据 触发上拉加载这个动作的时候再陆续加载数据 假如上拉一次加载10条数据 在小程序中 你快速滑动页面触发加载这个事件的话 你会发现小程序卡着不动了 刚开始以为数据加 ...

  6. CG-ctf WP

    week one 1 /x00 提示:有多种解法,你能找到几种 源码: writer up: 题目直接给出了源码,get 到一个 nctf 这个变量,int ereg(string pattern, ...

  7. Windows7上安装Ubuntu双系统

    零.前言 最近不小心把Ubuntu系统搞崩了打不开了,在网上找了找方法,从最初的步骤开始安装,本文是安装Ubuntu16.04,不过安装啥版本步骤都一样,下面逐一介绍. 一.如何卸载Ubuntu(第一 ...

  8. OpenGL的一些名词

    搬运自:https://learnopengl-cn.github.io/01%20Getting%20started/10%20Review/ 词汇表 OpenGL: 一个定义了函数布局和输出的图形 ...

  9. this与super

    this是引用,表示当前对象,堆中每一个对象都有this,保存的地址指向自身:super不是引用,是表示当前对象的父类特征. this可以使用在构造方法中,即this(..),必须出现在代码第一行,代 ...

  10. django学习系列——python和php对比

    python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...