我在openGL中使用高度图图像进行了基本地形生成,工作正常,但是地形顶点和法线的分辨率太低,如下图所示:
这里的地形网格生成并没有完成,它只是一个基本的三角形生成,所以让我们转到法线和高度图生成部分:
//Calculate the height of the vertex in the terrain
int Terrain::GetPixelHeight(unsigned char* data, int imageWidth, int x, int y)
{
if(x < 0 || x >= 256 || y < 0 || y >= 256) //If coordinates passes the image limit, just return 0
return 0;
else
{
unsigned char* pixelOffset = data + (x + imageWidth * y) * 1; //Get the image
unsigned char r = pixelOffset[0]; //Get R value
unsigned char g = pixelOffset[1]; //Get G value
unsigned char b = pixelOffset[2]; //Get B value
float height = (float)r + (float)g + (float)b; //Put values together to calculate the height
return height / 40; //Return the height with smooth in 40
}
}
现在正常计算:
//Calculate the normals based in the terrain height
float heightL = GetPixelHeight(data, y, x-1, z);
float heightR = GetPixelHeight(data, y, x+1, z);
float heightD = GetPixelHeight(data, y, x, z-1);
float heightU = GetPixelHeight(data, y, x, z+1);
glm::vec3 normalVector = glm::normalize(glm::vec3(heightL - heightR, 2.0f, heightD - heightU));
normals.push_back(normalVector.x); normals.push_back(normalVector.y); normals.push_back(normalVector.z);
着色器也是基本的,我可以保证它们没有问题,因为它们是游戏中其他对象的着色器,并且这个对象没有光计算的问题,所以我认为问题是使用高度图进行法线计算。
PS:地形大小与图像相同,256x256,图像只有黑白通道。