来自normalmap的opengl奇怪的输出

问题描述

我创建一个具有1024x1024点的terrain网格,从中生成一个法线贴图,然后尝试在我的顶点/片段着色器中使用它。当我从法线贴图绘制法线与从顶点着色器传递的法线相比时,我得到了奇怪的结果。我尝试通过将纹理分辨率提高到8192来提高质量,但是并没有消除奇怪的混叠效果。 当我从高度图中的相邻像素获取法线时,也会发生同样的情况。 我该如何解决?

法线贴图纹理的创建:

uint16_t channels = 3;
GLuint Texture = m_frameBuffers;
float* pData = new float[width * height * channels];

glGenTextures(1,&Texture);
glBindTexture(GL_TEXTURE_2D,Texture);

for (uint16_t y = 0; y < height; ++y)
{
    for (uint16_t x = 0; x < width; ++x)
    {
        uint32_t index = y * width + x;
        pData[index * channels + 0] = (normals[index].x) * 0.5 + 0.5;
        pData[index * channels + 1] = (normals[index].y) * 0.5 + 0.5;
        pData[index * channels + 2] = (normals[index].z) * 0.5 + 0.5;
    }
}
glTexImage2D(GL_TEXTURE_2D,GL_RGB,width,height,GL_FLOAT,pData);

glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_TEXTURE_WRAP_R,GL_REPEAT);

delete[] pData;

++m_frameBuffers;
return Texture;

片段着色器:

vec3 normal = texture(normalMap,VertexIn.texcoord).rgb;
normal = normalize(normal * 2.0 - 1.0); 
normal = normalize(vec3(normalmatrix*vec4(normal,1.0)));

normal from vertex

normal from normal map

编辑:我上传了更好的图片进行比较。它显示了1024x1024网格的相同区域,首先是来自顶点法线,其次是使用具有RGB16F的法线贴图

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...