我通过在椭球的内部应用纹理地图来渲染云。从远处(在云椭球面的中心),纹理看起来相当好,而且相当逼真。见下图:

问题是,当我飞到椭球面的边界附近(进入云中)时,我看到了构成椭球体的每一个四边形的边界。见下图:

任何关于如何绕过这件艺术品的建议都将不胜感激。我使用了50个网格段,在椭球的方位角和极地方向,它实际上在极点以下10度处被截断。纹理映射使用GL_MODULATE和GL_LINEAR和GL_LINEAR_MIPMAP_LINEAR作为Min和Mag过滤器。椭球基色为白色,因此不涉及阴影问题。我还验证了纹理坐标的正确应用和法线的正确定位。
提前谢谢。
我可以欺骗和使用许多雾,这将模拟实际飞行到云,但我真的很想实现一个优雅的健壮的解决方案。
发布于 2017-07-04 14:04:28
我发现了我所犯的错误,并在上面的评论中证实了这个假设。我根据当地参数化计算出每个四边形的不同顶点法线集。在启用照明的情况下,由于局部法线和光方向矢量之间的点积不同,因此对相邻四角体的顶点进行不同的阴影处理。
我所做的是平均出法线,在每个顶点上创建一个独特的法线。现在,当我飞向云层时,我看不到四边形的边界。
正如Dan建议的那样,我完全可以通过禁用照明来避免这个问题,但是它将消除模拟一天中不同时间的能力,而且无论如何,上面的修复都是有效的,只需要大约30行代码!
问题解决了。
如果其他人认为这是有用的,下面是代码(我用VBA编写的),用于计算给定曲面上一组具有拓扑矩形的顶点的平均顶点法线。
Sub Calculate_Averaged_Vertex_Normals(Vertx#(), M%, N%, VnormX#())
' INPUT:
'L,M: Array Dimensions
' Vertx - 3D array of vertex coordinates
' OUTPUT: VnormX: 3D array of Averaged Vertex Normals
Dim i%, j%, k%, p%, q%, w%, NormX#(3), Ncount%(), Vx#(), Fn#(3),Gn#(3),Hn#(3),A#
ReDim Ncount%(0 To L, NF + 1), Vx(0 To L, NF + 1, 4, 3)
For k = 0 To M - 1
For i = 0 To N - 1
Call Quad_Normal_Vector_Parametrisation(Vertx,k, i,Fn,Gn,Hn) ' Local Normals at each Vertex
p = k: q = i: Ncount(p, q) = Ncount(p, q) + 1: j = Ncount(p, q)
Call Quad_Vertex_Normal(0, 0, NormX,Fn,Gn,Hn)
For w = 1 To 3: Vx(p, q, j, w) = NormX(w): Next w
p = k: q = i + 1: Ncount(p, q) = Ncount(p, q) + 1: j = Ncount(p, q)
Call Quad_Vertex_Normal(1, 0, NormX,Fn,Gn,Hn)
For w = 1 To 3: Vx(p, q, j, w) = NormX(w): Next w
p = k + 1: q = i + 1: Ncount(p, q) = Ncount(p, q) + 1: j = Ncount(p, q)
Call Quad_Vertex_Normal(1, 1, NormX,Fn,Gn,Hn)
For w = 1 To 3: Vx(p, q, j, w) = NormX(w): Next w
p = k + 1: q = i: Ncount(p, q) = Ncount(p, q) + 1: j = Ncount(p, q)
Call Quad_Vertex_Normal(0, 1, NormX,Fn,Gn,Hn)
For w = 1 To 3: Vx(p, q, j, w) = NormX(w): Next w
Next i
Next k
For k = 0 To M
For i = 0 To N
For w = 1 To 3
A = 0#
For j = 1 To Ncount(k, i)
A = A + Vx(k, i, j, w)
Next j
VnormX(k, i, w) = A / Ncount(k, i) ' Averaged Vertex Normal
Next w
Next i
Next k
End Sub
Sub Quad_Normal_Vector_Parametrisation(Vertx#(),k%, i%,Fn#(),Gn#(),Hn#())
Dim j%, Bv#(3), CV#(3), Dv#(3)
For j = 1 To 3
Bv(j) = Vertx(k, i + 1, j) - Vertx(k, i, j) ' Tangent Vectors from Bilinear Parametrisation
CV(j) = Vertx(k + 1, i, j) - Vertx(k, i, j)
Dv(j) = Vertx(k + 1, i + 1, j) - Vertx(k, i + 1, j) - Vertx(k + 1, i, j) + Vertx(k, i, j)
Next j
Call CrossProd(Bv, CV, Fn) ' Normal Vector from Cross Product of Tangent Vectors.
Call CrossProd(Bv, Dv, Gn)
Call CrossProd(Dv, CV, Hn)
End Sub
Sub Quad_Vertex_Normal(x#, y#, NormX#(),Fn#(),Gn#(),Hn#())
Dim j%, Norm#
Norm = 0#
For j = 1 To 3
NormX(j) = Fn(j) + Gn(j) * x + Hn(j) * y
Norm = Norm + NormX(j) * NormX(j)
Next j
Norm = Sqr(Norm)
For j = 1 To 3
NormX(j) = NormX(j) / Norm
Next j
End Sub
Sub CrossProd(x#(), y#(), Z#())
Z(1) = x(2) * y(3) - y(2) * x(3)
Z(2) = y(1) * x(3) - x(1) * y(3)
Z(3) = x(1) * y(2) - y(1) * x(2)
End Subhttps://computergraphics.stackexchange.com/questions/5319
复制相似问题