在DirectX中使用顶点着色器渲染圆

时间:2015-06-11 23:42:10

标签: shader hlsl directx-9

我试图通过操纵顶点着色器内的texcoord坐标来绘制一个简单的2D圆。这是代码:

float2 uv2 = 2.0 * (TextureCoordinate.xy - 0.5);
float tnm = 1.0 - length(uv2);

在像素着色器中,这会绘制一个圆圈。顶点着色器中的相同代码将绘制纯白色。如果我玩数字但没有圆圈,我最多可以获得一些对角线渐变。

顶点着色器内部发生了什么?

PS。我应该澄清,我想要创建没有多边形或三角形或圆形对象/网格。我只需将texcoord传递给像素着色器并将其返回。在顶点执行1-texcoord会在像素输出中按预期方式翻转渐变。我的目标是在程序上生成一些球面法线。

PPS。假设它在顶点是[-1,-1]到[1,1],我做了:

(uv + 1) * 0.5;
circle code above which expects [0,1]
(result * 2) - 1;

但它不起作用。

1 个答案:

答案 0 :(得分:0)

首先,我建议您深入了解renderpipeline以及顶点着色器和像素着色器的含义。不要生我的气,但似乎你需要对这个话题有一些更基本的了解。

我将尝试快速概述一下您的问题:您将无法在顶点着色器中获得良好的圆,除非您高度重视几何体。你需要像素着色器来获得法线的球体。

  

顶点着色器内部发生了什么?

这是主要的问题:顶点着色器会转换您给定的几何体,因此可以对其进行光栅处理以将像素渲染到屏幕上。光栅化器将获取生成的三角形,并为三角形包含在屏幕上的每个像素生成一个像素。该像素将由像素着色器处理,并显示所得到的颜色。对于每个像素携带的数据,光栅化器内插三个角的顶点数据,因此每个像素具有它自己的位置依赖数据。 这是你的问题。

如果用圆形数据填充顶点,则这四个点会增加到圆的位置,并且将对其间的点进行线性插值,但是圆不能以这种方式描述为线性。一个小图片澄清:

enter image description here

如您所见,四角纹理坐标被映射到圆坐标。他们躺在外面,所以他们的y高度将被映射到零。现在这四个点被插值为像素着色器,导致更高的零高度而没有真正的圆。顶点着色器中的每个插值都以菱形结束,如果你将四次分割成四边形,你就会得到一个菱形,如果你将其分割得越来越近,它会接近一个圆,但永远不会是完美的。

因此您需要像素着色器。因此,每个像素都得到其插值位置,以确定正确的球面法线,而不是错误的插值法线。

enter image description here

由于这个问题,最现代的照明计算是在pixelhader中进行的。特别是对于高光照明,必须获得精细和精确的高光。

我希望我的解释很容易理解:)