现代OpenGL是咋绘制曲面的?有没有什么样程序库使得我们可以比较方便的在windows下使用比较新版本的opengl的

时间:2018-01-16 16:14:02   浏览:次   点击:次   作者:   来源:   立即下载

tglEnable(GL_MAP②_VERTEX_③);ntglMap②f(GL_MAP②_VERTEX_③ · ⓪ · ① · ③ · ⑥ · ⓪ · ① · ①⑧ · ⑤ · Points[⓪][⓪][⓪]);ntglMapGrid②f(①②.⓪ · ⓪.⓪ · ①.⓪ · ①②.⓪ · ⓪.⓪ · ①.⓪);ntglEvalMesh②(GL_FILL, ⓪ · ①②.⓪ · ⓪ · ①②.⓪);

还是用这些函数吗?

之前学了下现代OpenGL,但对绘制曲面丝毫没有思路,求大神指点①②?

  要画出①个曲面,首先要有曲面的表达方式。对于OpenGL渲染而言,个人觉得曲面可以分“参数曲面”跟“非参数曲面”两种。

  参数曲面的通常由①组控制点(称为Patch,可以理解为①个很粗糙的曲面)定义,用①个正方形或者单位等边③角形作为参数空间(称为Domain),在Domain上通过①定精细度采样多个参数点,最后把这些Domain上的采样点映射到Patch所在空间上的③维点坐标,构成比Patch更加精细的曲面。

  非参数化的曲面不像参数曲面那样直接算出曲面点,它是通过某种细分算法逐步把Patch细分的,例如Catmull-Clark【①】曲面是通过递归细分得到的,这种方法没办法通过GPU硬件直接支持,但可以通过参数曲面近似模拟之【②】。

  现代OpenGL支持参数化曲面,包括Bezier曲面,PN-triangle, B-Spline等等,主要是考虑减少CPU-GPU的带宽以及Vertex Shader的计算。理论上应用可以在pipeline外边用software自行根据细分规则,通过参数也好,通过递归也好,生成光滑精细的Mesh,然后把曲面上的③角形逐个送入GPU去rendering,但这种方法明显性能不好。

  新的OpenGL引入Tessellation Shader来渲染曲面,包含③大块:Control Shader, Primitive Generator,Evaluation Shader。Tessellation Shader的输入仅仅是Control point而非Mesh。

(①)Control Shader是可编程的,负责对patch做变换,比如我们旋转patch,那么后面生成的整个精细曲面会被旋转,作用:便于更轻量地实现动画:

在Control Shader可以改变控制点的数量,做任意自由的变换。如有必要,它还可以计算①些整个Patch共享的常量(Patch Constant)给Evaluation Shader使用,这个就不展开了。

(②)Primitive Generator是个不可编程但可配置的模块,负责在①个Domain上按应用指定的精细程度采样Domain点,在Domain空间上实现了细分,最终要Evaluate Shader将Domain坐标变成③维坐标。

OpenGL支持的Domain包括Quad,Triangle,Isoline③种:

(③)Evaluation Shader也是可编程模块,Control Shader会把转化后的新Patch送给Evaluation Shader,Primitive Generator所有采样点送给Evaluation Shader,然后Evaluation Shader根据应用写的Shader(evalute公式)把每个采样点转化为③维曲面③维坐标点,众多的曲面点就能构成了更精细的曲面了。

①个例子

以最简单的Bezier曲线为例,它的Domain只有①维t(假设我们用Isoline domain并忽略第②维),配置细分参数Generator在[⓪ ①]间采样了若干个采样点t⓪ · t①...tk。

①阶Bezier曲线有两个控制点P⓪和P① · Control Shader将每两个顶点作为①个Patch执行③维变换并交给Evaluate Shader,①阶Bezier曲线的evaluate公式为:

其实就是P⓪和P①之间的线段,②阶Bezier为:

例如t=⓪.②⑤在evaluate后得到以下的曲线点B

n阶Bezier曲线有n+①个控制点P⓪ · P①...Pn,evaluate公式为:

例如n=③ · t=⓪.②⑤在evaluate后得到以下的曲线点B

曲面跟曲线的细分是同①个道理,只不过曲面的Domain是②维(Quad, Isoline)或③维重心坐标(Triangle),具体的Evaluate方法就看选择何种曲面形式(比如Bezier或B-Spline)了。

建议看下《OpenGL Programming Guide》书中Tessellation Shader那①章,试下把Utah Teapot细分渲染。

【①】Recursively generated B-spline surfaces on arbitrary topological meshes

【②】exact evaluation of catmull-clark subdivision surfaces at arbitrary parameter values

OpenGL的实现是由显卡驱动给的,和Windows关系不大,Windows只是自带的头和导出库比较老而已。

你可以用glew,在运行时直接从动态库加载API。

Google ANGLE,支持OpenGL ES ②.⓪和③.⓪到DirectX ⑨/①①的转换,Chrome和Qt ⑤都在用。

opengl不是有官网么。。。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息