D3D10与Geometry Shader学习笔记2

 
D3D10与Geometry Shader学习笔记(2)
 
华南理工大学,张嘉华 newzjh@126.com QQ:188318005,欢迎和我多多交流,共同学习进步
1.     贝赛尔曲线在Geometry Shader下的实现
贝赛尔曲线在图形绘制中经常用到,在这一节里面讲介绍如何在Geometry Shader下实现贝赛尔曲线的绘制.首先来看最简单的贝赛尔曲线,就是由四个点控制.
 
考虑到贝赛尔曲线输入是四个点,而我们这里是为二维图形绘制实时的贝赛尔曲线,因此可以用两个四维的顶点表示这四个二维的点,因为对于Geometry Shader输入的类型中point必须是一个点,line是两个点,triangle是三个点,也就是input数组的大小,而不存在四个元素的输入数组类型.在GS_Bezier()首先把两个四维的点转换为四个二维的点.接着根据贝赛尔曲线的函数,通过100次线段细分来逼近曲线,因此t=1/100,计算t1,t2为处于整段曲线的比例,接着利用贝赛尔曲线函数计算出每个线段的两端的两个点,接着Append到输出流,每输出一段线段都需要RestartStrip()一下,以确认以之前append的数据构成图元输出了.输出流这里定义为LineStream表示线段流.下面是HLSL文件,重点是Geometry Shader的代码:
struct GSIn
{
    float4 pos          : POSITION;
};
 
GSIn VS_Bezier(int i : TEXCOORD0)
{
    GSIn Output;
    Output.pos = pos[i];
    return Output;
}
 
[maxvertexcount(100)]
void GS_Bezier(line GSIn input[2], inout LineStream<PS_INPUT> LineOutputStream)
{
         float2 positions[4];
         positions[0]=input[0].pos.xy;
         positions[1]=input[0].pos.zw;
         positions[2]=input[1].pos.xy;
         positions[3]=input[1].pos.zw;
 
        for(int i=0;i<=99;i++)  
        {
                   float t1=i*0.01;  
                 float x1=positions[0].x*(1-t1)*(1-t1)*(1-t1)+positions[1].x*(1-t1)*(1-t1)*3*t1+positions[2].x*(1-t1)*3*t1*t1+positions[3].x*t1*t1*t1;  
                   float y1=positions[0].y*(1-t1)*(1-t1)*(1-t1)+positions[1].y*(1-t1)*(1-t1)*3*t1+positions[2].y*(1-t1)*3*t1*t1+positions[3].y*t1*t1*t1;  
 
                   float t2=(i+1)*0.01;  
                 float x2=positions[0].x*(1-t2)*(1-t2)*(1-t2)+positions[1].x*(1-t2)*(1-t2)*3*t2+positions[2].x*(1-t2)*3*t2*t2+positions[3].x*t2*t2*t2;  
                   float y2=positions[0].y*(1-t2)*(1-t2)*(1-t2)+positions[1].y*(1-t2)*(1-t2)*3*t2+positions[2].y*(1-t2)*3*t2*t2+positions[3].y*t2*t2*t2;  
 
                   PS_INPUT output1;
                   output1.Pos=float4(x1,y1,0.0f,1.0f);
                   output1.color=float4(1,1,1,1);
                   output1.uv=float2(0,0);
               
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值