OpenGL高度图地形和低分辨率法线

时间:2018-01-16 17:16:56

标签: c++ opengl terrain normals vertices

我在openGL中使用高度图图像进行了基本地形生成,工作正常,但是地形顶点和法线的分辨率太低,如下图所示:

法线图像
Image of the normals

地形中顶点的图像
Image of the vertices in terrain

这里的地形网格生成并没有完成,它只是一个基本的三角形生成,所以让我们转到法线和高度图生成部分:

//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,图像只有黑白通道。

0 个答案:

没有答案