CG

着色器语言的语义SV_POSITION和POSITION之辨析

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 简单地说POSITION语意用于顶点着色器,用来指定这些个位置坐标值,是在变换前的顶点的object space坐标。SV_POSITION语意则用于像素着色器,用来标识经过顶点着色器变换之后的顶点坐标。 SV是Systems Value的简写。在SV_Position的情况下,如果它是绑定在一个从VS输出的数据结构上的话,意味着这个输出的数据结构包含了最终的转换过的,将用于光栅器的顶点坐标。或者,如果你将这个标志绑定到一个输入给PS的数据数据的话,它会包含一个基于屏幕空间的像素的坐标。所有的这些SV语义都在DirectX SDK文档中有描述。 vertex shader将会输出顶点的坐标到裁剪空间中,并且这些坐标是使用齐次坐标系的。一般地,这些基于裁剪空间的齐次坐标,是通过对输入的对象空间坐标位置乘以一个WVP矩阵而得到的。然后在光栅器中,这些齐次坐标将会进行透视除法,即对这些坐标的每个分量除以w,做完透视除法后,这些坐标值将会限定在一个左下角是-1,右上角是1的视口范围中。然后做完“把Y坐标翻转,把取值范围从[-1,1]限制到[0,1],接着xy方向分别乘以视口的宽高”的视口变换之后,你便获得了“以SV_Position为标识的,传递给PS的,取值范围是[0,视口高宽],视口左上角为坐标原点的”像素位置坐标。 从D3D10开始出现的SV_Position语意,提供了类似于在Direct3D9对应的Shader Model3.0版本中的VPOS语意。在SM3.0中增加的VPOS语意,是特意用来表示某个像素点的坐标为屏幕空间坐标的。在D3D10及更高的版本中,SV_Position语意同样指定了某个像素点的坐标为屏幕空间坐标。但与VPOS不同的是,指定了SV_Position语意的屏幕空间坐标,光栅器已经自动地对这个值做了0.5像素的偏移,也就是说这个坐标对应的是该像素的中心点而不是左上角。

软渲染示例程序Tiny3D的实现简介

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 绘制图形的代码 Tiny3D核心的图形绘制代码调用栈如下图所示 Device::DrawBox函数 Tiny3D的核心绘制代码的入口函数Device::DrawBox函数 // theta mesh的旋转角度 // box_vertices mesh的原始模型顶点数据 void Device::DrawBox(float theta, const T3DVertex* box_vertices) Device::DrawBox函数的实现如下代码所示: void Device::DrawBox(float theta, const T3DVertex* box_vertices) { T3DMatrix4X4 m; T3DMatrixMakeRotation(&m, -1.0f, -0.5f, 1.0f, theta); transform_.SetWorldMatrix(m); transform_.Update(); DrawPlane(&box_vertices[0], &box_vertices[1], &box_vertices[2], &box_vertices[3]); DrawPlane(&box_vertices[4], &box_vertices[5], &box_vertices[6], &box_vertices[7]); DrawPlane(&box_vertices[0], &box_vertices[4], &box_vertices[5], &box_vertices[1]); DrawPlane(&box_vertices[1], &box_vertices[5], &box_vertices[6], &box_vertices[2]); DrawPlane(&box_vertices[2], &box_vertices[6], &box_vertices[7], &box_vertices[3]); DrawPlane(&box_vertices[3], &box_vertices[7], &box_vertices[4], &box_vertices[0]); } 步骤就是如下的几步: 根据传递进来的mesh的旋转角度theta,调用T3DMatrixMakeRotation函数构建world matrix,然后更新到Transform类中去 调用Transform::Update函数,更新world-view-projection matrix,这WVP matrix将在后面的用来变换顶点。 把一个六面体BOX拆分成6个矩形面,调用DrawPlane函数进行绘制。 Device::DrawPlane函数 Device::DrawPlane函数的实现如下代码所示: void Device::DrawPlane(const T3DVertex* p1, const T3DVertex* p2, const T3DVertex* p3, const T3DVertex* p4) { T3DVertex _p1 = *p1, _p2 = *p2, _p3 = *p3, _p4 = *p4; _p1.