论文上对GPU的讨论之《基于GPU加速度光线与三角面片求交》

1.渲染语言:GPU基于数据流计算模式。

2.流处理器把函数称作“内核”,把输入数据称作“流”。

3. 光线与三角网格求交:

输入流:三角顶点,光线参数

输出流:求交点颜色值

内核:片元程序Fragment Program

4.纹理实质是二维数组,其元素为颜色值。单个颜色值:纹理元素/纹理像素。

5.片元由【光栅器】产生,其纹理坐标存储在纹理内存中。

6.纹理查找功能:吧纹理内存子系统作为一个通用只读内存使用,以便通用计算(该功能使得GPU上实现许多包含复杂数据结构的算法,以及查找这些复杂数据结构中的元素)。

7.CPU与GPU参数传递:

【首先】Cg编译器把Cg程序翻译成OpenGL/Direct3D可以接收到形式

【然后】应用程序通过OpenGL/Direct3D命令把翻译后的Cg程序传递给GPU

注意:应用程序和Cg程序之间的参数传递是影响执行速度的关键因素。

8.CPU到GPU传参:

8.1【直接参数传递】

cgGetNameParameter():获取一个参数句柄

cgGLSetParameter3d():通过句柄用该方法设置参数

——传参是CPU与GPU协调过程,算法每执行一次,参数必须传递一次,因此该方法效率不是最优。

8.2【基于纹理参数传递】

把参数编码成纹理;一个纹理4个32位值:3个颜色通道(RGB),1个Alpha通道。

8.3Moller-Trumbore算法中:一个三角形每个顶点编码为一个纹理。

【例如】256个三角形,使用3×16×16纹理。

另外,增加一个纹理,用于存储光线参数。

如果三角形面片个数不是某个数的整数倍,用填0方式进行纹理扩充。

【代码】如下:

for(y=0;y{
    for (x=0;x    {
        getNextTriangle(vertex0,vertex1,vertex2);
        vo_data[y][x][0]=(GLfloat)((1.0+vertex[0])/2.0);
        vo_data[y][x][1]=(GLfloat)((1.0+vertex[1])/2.0);
        vo_data[y][x][2]=(GLfloat)((1.0+vertex[2])/2.0);
        vo_data[y][x][3]=(GLfloat)1.0;
        (...)
    }
}

glTexImage2D(GL_TEXTURE_RECTANGLE_NV,0,
             GL_FLOAT_RGBA32_NV,texture_s ize,
             texture_s ize,0,GL_RGBA,GL_FLOAT,vo_data);

下面代码为纹理作为参数调用的简略说明:

float4 main(vertex_out_fragment_in IN,
            uniform sampler2D vertices0:TEXTURE0,
            uniform sampler2D vertices1:TEXTURE1,
            uniform sampler2D vertices2:TEXTURE2,
            uniform sampler2D ray_origins:TEXTURE3):COLOR
{
    //从纹理中提取求交中需要的参数
    float3 v0=(2*tex2D(vertices0,IN.texCoord0).rgb)-1.0;
    (...)
    float4 resul t=(inters ect(ray_origin,v0,v1,v2)+1.0)/2;
    return resul t; // 返回求交点颜色
}

性能讨论:如果n×n纹理传递到片元处理器,执行n×n算法通道只需传递一次,相比较直接传参,性能大为提高。

9.GPU到CPU传参:

片元处理器工作完毕,确定一个片元的最终颜色。CPU到CPU传递每个值,都要进行按颜色编码。

在Cg里,用一个输出语句指明变量是如何与图形流水线的其他部分相连接的,当Cg程序返回输出结构的时候,Color指明了该成员的硬件资源。

float4 main(vertex_out_fragment_in IN,
            uniform float3 ray_origin,uniform float3 v0_triangle,
            uniform float3 v1_triangle,uniform float3 v2_triangle):COLOR
{
    return intersection(ray_origin,v0_triangle,v1_triangle,v2_triangle);
}

执行结果:输出颜色绘制在当前的渲染环境中。

颜色值到求交结果转化:glReadPixels()方法读取【图形硬件存储器中帧缓冲值】实现。

当算法结果编码成OpenGL图元时,图元不是立即显示,而是存储在像素缓存中,待所有面元处理完毕后,一起进行绘制显示。

10.取值范围:颜色为浮点值,范围0~1,求交运算中,操作数范围在-1~1之间,因此必须进行转换。

_____________________________________________________________________

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值