OpenGL Terrain
#include <gl/glew.h> #include <gl/gl.h> #include <gl/glu.h> #include <gl/glaux.h> #include <tchar.h> #include "jpeglib.h" #include <GLFW/glfw3.h>
顶点着色器要求
您应该编写一个提供两种渲染模式的顶点着色器。
第一种模式 - 键 “1”、“2”、“3” 在第一种模式下,只需使用模型视图和投影矩阵转换顶点。在着色器中保持颜色不变。此顶点着色器已在入门代码中提供。此模式应用于点渲染(键 “1”)、线渲染(键 “2”)和三角形渲染(键 “3”)。为了提高地形的视觉质量,在使用这些模式时,您可以随意使用您选择的任意常数缩放地形高度(键 “1”、“2”、“3”)。您可以在创建 VBO 时在 CPU 上执行此操作。
第二种模式 - 键 “4”
在第二种模式中,不要在 CPU 上缩放地形高度;高度应等于 1.0 * heightmapimage - height [ i ][ j ] / 256.0f 。在此模式下,您应该将顶点位置更改为其自身和四个相邻顶点的平均位置 - 在顶点着色器中执行此操作。具体来说,将 p_center 替换为 (p_center + p_left + p_right + p_down + p_up) / 5(见图)。这将具有平滑地形的效果(效果在低图像分辨率(例如 128 x 128)下最明显)。 (i, j + 1) (i - 1, j) (i, j) (i + 1, j) (i, j - 1)
“scale” 和 “exponent” 的初始值都应该是 1。然后,当用户按下这些键时,您应该将新的变量值上传到 GPU。变量 “scale” 和 “exponent” 仅在使用键 “4” 时才需要,即在第二种模式下 —— 使用键 “1”、“2”、“3” 时不需要它们。在模式 4 中,您只需要支持三角形渲染;在此模式下,您不需要绘制点或线。 最后,在顶点着色器中,您应该像往常一样使用顶点着色器中的模型视图和投影矩阵转换生成的顶点位置。 四个相邻顶点的位置应作为属性之一传递到顶点着色器中,方式与顶点位置和颜色相同。为了适应这一点,顶点应该创建额外的 VBO。例如,一种方法是创建 4 个 3 浮点数的 VBO:左顶点、右顶点、上顶点、下顶点 的位置。请注意,这些位置为相对顶点的位置作为其坐标之一。如果右顶点的位置超出图像范围(这将发生在图像边界处),请将右顶点的位置 “设置” 为中心顶点的位置。对图像顶部和底部边缘的上下顶点也执行等效操作。如上所述,“比例” 和 “指数” 应在着色器中作为统一变量传递。 您应该编写一个满足上述要求的顶点着色器。为了在两种模式之间切换,您应该在顶点着色器中创建一个统一变量 “uniform int mode”,并使用 “glUniform1i” 将其上传到 GPU。当用户按下键 “4” 时,模式应设置为 1。当用户按下键 “4” 时,模式应设置为 1。当 mode = 0 时,顶点着色器应执行第一种模式。当 mode = 1 时,顶点着色器应执行第二种模式(平滑顶点位置并缩放 / 指数化地形)。您可以在顶点着色器中使用 “if 语句” 来实现这一点。