我正在尝试构建一个基于 3D 体素的游戏引擎来学习如何使用 vulkan。我撞到了一堵墙,我找不到有关如何攀登的文档。现在我正在绘制一个 2D 三角形并在屏幕上移动它,我的 2D 三角形被定义为顶点缓冲区中的 1 个顶点,将来会在我的顶点着色器中转换为屏幕空间。这个单个顶点被我的几何着色器变成了 3 个顶点,然后传递给我的片段着色器。
triangle_center_position[0] = (cursor_x - (vulkan_window_width_get() / 2.0f)) / vulkan_window_width_get();
triangle_center_position[1] = (cursor_y - (vulkan_window_height_get() / 2.0f)) / vulkan_window_height_get();
// send to gpu via memory mapped region
memcpy(triangle_position_buffer.mapped_memory, &triangle_center_position, sizeof(vec2) * 1);
Run Code Online (Sandbox Code Playgroud)
它以下列方式绑定在命令缓冲区中:
VkBuffer vertexBuffers[] = {buffer->buffer};
VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(command_buffer[i], 0, 1, vertexBuffers, offsets);
vkCmdDraw(command_buffer[i], (uint32_t) buffer->num_elements, 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)
我的计划是最终修改此代码以接收 3D 点,并让我的几何着色器将我的 3D 点扩展为体素。
不幸的是,我只希望这种转换发生在体素世界中的块上,而不是其他事物(玩家模型等)上。
在 OpenGL 中,我只会调用glUseProgram()为不同的“材质”构建的两个着色器程序,这在 vulkan 中似乎非常不鼓励。我的直觉是这样的
currentMaterial = null
for …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Basemap 制作热/强度图。我的输入是当时的一组纬度、经度和强度。数据集如下所示:
lat[0], lon[0] = intensity[0]
lat[1], lon[1] = intensity[1]
...
lat[n], lon[n] = intensity[n]
Run Code Online (Sandbox Code Playgroud)
在每个索引处,纬度和经度对应于正确的传感器读数。我的代码看起来像这样:
fig = plt.figure(figsize=(10, 8))
# Set title
fig.suptitle("Intensities {} {}".format(start_time, stop_time))
# US Centered Map
map_axis = fig.add_subplot(111)
map = Basemap(
ax = map_axis,
lat_0 = 40, lon_0 = -95,
width = 6500e3, height = 6500e3,
projection = 'stere',
resolution = 'l'
)
map.drawcoastlines()
lats = ...
lons = ...
intn = ...
# Convert coordinates
lons, lats = map(lons, lats)
LONS, LATS …Run Code Online (Sandbox Code Playgroud)