Depth peeling

本文介绍了一种名为深度剥离的技术,该技术通过多次渲染获取不同层级的深度信息。具体实现过程包括两步:首先进行正常渲染以获取最底层的深度值;然后在后续的渲染过程中,利用上一次渲染得到的深度值作为比较基准,从而逐步获取每一层的深度信息。

例子见Nvidia DX10 sdk 《Stencil Routed KBuffer》

 

主要实现:第一遍正常渲染,获得Z最小的一层深度值,第二层将第一层深度值作为ShaderResourceView传入,若场景的Z小于等于第一层深度,则discard,这样获得第二层深度值;后面以此类推。

 

// tDepthBuffer为上一层深度, IN.HPosition为屏幕坐标
        DepthColorOutput DepthPeelPS ( Geometry_VSOut IN )
        {
            DepthColorOutput output = (DepthColorOutput)0.0f;

            float zFront = tDepthBuffer.Load( int3( IN.HPosition.xy, 0 ) ).r;
            if (IN.HPosition.z <= zFront) discard;
           
            output.DepthColor.x = pack_eyez(IN.HPosition.w);
            output.DepthColor.y = pack_normal(IN.Normal);
           
            return output;
        };

转载于:https://www.cnblogs.com/ActionFG/archive/2012/09/08/2677118.html

#include <GL/glut.h> #include<math.h> using namespace std; #define PI 3.14159265354 GLfloat CIRCLE = 1.2f; GLfloat CIRCLE2 = 1.0f; int point = 720; GLfloat z = -5.0f; //用于记录平移距离 void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); } void Reshape(GLsizei w, GLsizei h) { //重置窗口大小 glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, 1.0 * (GLfloat)w / (GLfloat)h, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -3.6); } // 显示函数,采用堆栈的方式 void display() { glClearColor(1, 1, 1, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 设置单位矩阵 glTranslatef(0.0f, 0.0f, z); glLoadIdentity(); glRotatef(1, 1.0f, 0.0f, 0.0f); double angle1 = 2 * PI / point; glPushMatrix(); // 绘制蓝色圆环 glColor4f(0, 0, 1, 0.7); glTranslatef(-2.4f, 1.0f, z); double angle2 = 0.0; glBegin(GL_LINE_STRIP); for (int i = 0; i <= point; i++) { angle2 += angle1;//每次循环加一度 glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));//利用三角函数定位每次绘画的点的位置 glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2)); } glEnd(); glPopMatrix(); glPushMatrix(); // 补充黄色圆环 glColor4f(1, 0.7, 0, 0.9); glTranslatef(-1.2f, 0.0f, z); angle2 = 0.0; glBegin(GL_LINE_STRIP); for (int i = 0; i <= point; i++) { angle2 += angle1;//每次循环加一度,共进行60次循环,实现绘画一个60度的扇形的效果 glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2)); glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2)); } glEnd(); glPopMatrix(); glPushMatrix(); //绘制黑色圆环 glTranslatef(0.1f, 1.0f, z); glColor4f(0, 0, 0, 0.7); angle2 = 0.0; glBegin(GL_LINE_STRIP); for (int i = 0; i <= point; i++) { angle2 += angle1;//每次循环加一度 glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2)); glVertex2d(CIRCLE2 *
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值