强大的GPU片段编程:

强大的GPU片段编程:
在CG程序中,顶点程序的输入一定要有一个POSITION,也一定要输出一个POSITION ,输入的POSITION 为顶点在模型空间的位置,输出为最终的CLIP空间的位置,而在片段程序中,输入只能是COLOR和TEXCOODx, 输出只能为COLOR,因为这是GPU渲染的最后一步,你只能改变每个片段的颜色。但是如果我想根据 片段的位置来改变他的颜色怎么办呢,输入中没有POSITION,但是这个TEXCOORD却是一个神通广大的量, 它可以代表任何从顶点程序中传回的向量。我们可以在顶点程序中定义一个TEXCOORD0予以的向量,然后把 顶点的POSITION传给他,那么在片段程序中就可以接受到这位置信息,这就可以实现很多的功能 下面是一个应用片段程序做的DEMO,它根据三角形的每个像素点的位置加上正弦波滤波得到该点的颜色, 这个效果在纯OPENGL中是很难得到的,因为OPENGL是基于顶点插值渲染的,二这个DEMO不是插值是直接赋予 像素点颜色,而且它运行速度极快,因为在GPU中SIN这种函数只是一个指令,就跟假发操作一样高效;
注意我们实现的效果的关键的片段程序只有一行代码!
CG源程序;
顶点程序: struct C2E1v_Output { float4 position : POSITION; float4 fragposition :TEXCOORD0; }; C2E1v_Output C2E1v_green(float2 position : POSITION) { C2E1v_Output OUT; OUT.position = float4(position,0,1); OUT.fragposition=float4(position,0,1); return OUT; }
片段程序: void test( float4 position : TEXCOORD0, out float3 color:COLOR) { color=float3(sin(position.x*10),sin(position.y*10),sin(position.z*10)); }

 

上一篇:Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)


下一篇:opengl编程学习笔记(四)(纹理映射)(结合nvdia OpenglSDk 的nvimage类)