我有一个由THREE.PlaneBufferGeometry
(水面)制成的网格,在那个表面上是另一个物体(船)。我的问题是,当船稍微进入水中时,你会看到水突然出现在船内(因为y值较高)。
我该如何解决这个问题?
我正在考虑计算船内部的尺寸并试图将它们传递到水面的着色器。 (如果该点位于内部,则隐藏它。)这是最好的方法吗?我怎么能这样做?
编辑:水应该与船的两侧重叠(例如,在前面示出)。要澄清: Current situation: Desired situation:
B A
| | | |
-----|---------|-------- -----| |--------
|_________| |_________|
从[A]你不应该看到船体内的水,而且[B]你不应该看到船的下部。
答案 0 :(得分:1)
尝试禁用水面的深度书写。检查以下示例。让我们说蓝色平原是水,红色是船。
import numpy as np
import pyopencl as cl
import pyopencl.array
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
m, n = 5, 5
A = np.random.uniform(size=(m, n)).astype(np.float32)
clA = cl.array.Array(queue, A.shape, A.dtype)
clA.set(A)
clV = clA[1::2, 1::2]
def data(array):
if array.offset:
return array.base_data.get_sub_region(array.offset, 1)
else:
return array.data
source = """
__kernel void fn(long si, long sj, __global float *Y)
{
const int i = get_global_id(0);
const int j = get_global_id(1);
Y[i*si + j*sj] = 3;
}
"""
kernel = cl.Program(ctx, source).build().fn
gsize = clV.shape
lsize = None
estrides = np.array(clV.strides) / clV.dtype.itemsize
kernel(queue, gsize, lsize, estrides[0], estrides[1], data_ptr(clV))
print(clA.get())