Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL Phong照明:镜面反射高光错误_Opengl_Glsl_Shader_Phong - Fatal编程技术网

OpenGL Phong照明:镜面反射高光错误

OpenGL Phong照明:镜面反射高光错误,opengl,glsl,shader,phong,Opengl,Glsl,Shader,Phong,在OpenGL中,我的Phong lighting着色器似乎有一个奇怪的问题。镜面反射高光显示在对象的错误一侧 当前的问题是: 如您所见,镜面反射高光出现在立方体的另一侧(从灯光的角度看,也出现在立方体垂直边的角上。它应该只出现在离灯光最近的一侧) 立方体的顶点: float cubeVertices[] = { // positions // normals // texture coords -1.0f, -1.0f, -1.0f,

在OpenGL中,我的Phong lighting着色器似乎有一个奇怪的问题。镜面反射高光显示在对象的错误一侧

当前的问题是:

如您所见,镜面反射高光出现在立方体的另一侧(从灯光的角度看,也出现在立方体垂直边的角上。它应该只出现在离灯光最近的一侧)

立方体的顶点:

float cubeVertices[] = {
    // positions          // normals           // texture coords
    -1.0f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  0.0f, 0.0f,
    -1.0f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  1.0f, 0.0f,
     1.0f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  1.0f, 1.0f,
     1.0f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  1.0f, 1.0f,
     1.0f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  0.0f, 1.0f,
    -1.0f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  0.0f, 0.0f,
    -1.0f, -1.0f,  1.0f,  0.0f,  0.0f, 1.0f,   0.0f, 0.0f,
     1.0f, -1.0f,  1.0f,  0.0f,  0.0f, 1.0f,   1.0f, 0.0f,
     1.0f,  1.0f,  1.0f,  0.0f,  0.0f, 1.0f,   1.0f, 1.0f,
     1.0f,  1.0f,  1.0f,  0.0f,  0.0f, 1.0f,   1.0f, 1.0f,
    -1.0f,  1.0f,  1.0f,  0.0f,  0.0f, 1.0f,   0.0f, 1.0f,
    -1.0f, -1.0f,  1.0f,  0.0f,  0.0f, 1.0f,   0.0f, 0.0f,
    -1.0f,  1.0f,  1.0f, -1.0f,  0.0f,  0.0f,  1.0f, 0.0f,
    -1.0f,  1.0f, -1.0f, -1.0f,  0.0f,  0.0f,  1.0f, 1.0f,
    -1.0f, -1.0f, -1.0f, -1.0f,  0.0f,  0.0f,  0.0f, 1.0f,
    -1.0f, -1.0f, -1.0f, -1.0f,  0.0f,  0.0f,  0.0f, 1.0f,
    -1.0f, -1.0f,  1.0f, -1.0f,  0.0f,  0.0f,  0.0f, 0.0f,
    -1.0f,  1.0f,  1.0f, -1.0f,  0.0f,  0.0f,  1.0f, 0.0f,
     1.0f,  1.0f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f, 0.0f,
     1.0f, -1.0f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f, 1.0f,
     1.0f, -1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f, 1.0f,
     1.0f, -1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f, 1.0f,
     1.0f,  1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f, 0.0f,
     1.0f,  1.0f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f, 0.0f,
    -1.0f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f,  0.0f, 1.0f,
     1.0f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f,  1.0f, 1.0f,
     1.0f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f,  1.0f, 0.0f,
     1.0f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f,  1.0f, 0.0f,
    -1.0f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f,  0.0f, 0.0f,
    -1.0f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f,  0.0f, 1.0f,
    -1.0f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f,  0.0f, 1.0f,
    -1.0f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f,  1.0f, 1.0f,
     1.0f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f,  1.0f, 0.0f,
     1.0f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f,  1.0f, 0.0f,
     1.0f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f,  0.0f, 0.0f,
    -1.0f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f,  0.0f, 1.0f
};
顶点着色器:

#version 330 core

layout (location = 0) in vec3 vPos;
layout (location = 1) in vec3 vNormal;
layout (location = 2) in vec2 vTexCoords;

out vec3 FragPos;
out vec3 Normal;
out vec2 TexCoords;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    FragPos = vec3(model * vec4(vPos, 1.0));
    Normal = mat3(transpose(inverse(model))) * vNormal;  
    TexCoords = vTexCoords;

    gl_Position = projection * view * vec4(FragPos, 1.0);
}
片段着色器:

#version 330 core

out vec4 FragColor; 

in vec3 FragPos;  
in vec3 Normal;  
in vec2 TexCoords;

uniform vec3 viewPos;
uniform sampler2D diffuseMap;

struct Light {
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

uniform Light lights[8];
uniform int numLights;

vec3 calculateAmbient(vec3 fragPos, vec3 materialAmbient)
{
    vec3 ambient = vec3(0.0);

    for (int i = 0; i < numLights && i < 8; i++)
    {
        ambient += lights[i].ambient * materialAmbient;
    }

    return ambient * 0.5;
}

vec3 calculateDiffuse(vec3 fragPos, vec3 normal, vec3 materialDiffuse)
{
    vec3 diffuse = vec3(0.0);

    for (int i = 0; i < numLights && i < 8; i++)
    {
        vec3 lightDir = normalize(lights[i].position - fragPos);
        float diff = max(dot(normal, lightDir), 0.0);
        diffuse += lights[i].diffuse * (diff * materialDiffuse);
    }

    return diffuse;
}

vec3 calculateSpecular(vec3 fragPos, vec3 normal, vec3 viewDir, vec3 materialSpecular, float shininess)
{
    vec3 specular = vec3(0.0);

    for (int i = 0; i < numLights && i < 8; i++)
    {
        vec3 lightDir = normalize(lights[i].position - fragPos);
        vec3 reflectDir = reflect(-lightDir, normal);
        float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32.0f * shininess);
        specular += lights[i].specular * (spec * materialSpecular);
    }

    return specular;
}

void main()
{
    vec4 tex = texture(diffuseMap, TexCoords);

    vec3 norm = normalize(Normal);
    vec3 viewDir = normalize(viewPos - FragPos);

    vec3 ambient = calculateAmbient(FragPos, material.ambient);
    vec3 diffuse = calculateDiffuse(FragPos, norm, material.diffuse);
    vec3 specular = calculateSpecular(FragPos, norm, viewDir, material.specular, material.shininess);

    vec3 result = (ambient + diffuse + specular) * tex.rgb;
    FragColor = vec4(result, 1.0);
} 
#版本330核心
out vec4 FragColor;
在vec3 FragPos中;
vec3正常;
在vec2-TexCoords中;
统一的vec3视图位置;
均匀采样二维扩散图;
结构光{
vec3位置;
vec3环境;
vec3弥漫性;
vec3镜面反射;
};
均匀光照[8];
统一的内部照明;
vec3计算组件(vec3框架组件、vec3材料组件)
{
vec3环境=vec3(0.0);
对于(int i=0;i
镜面反射高光也会出现在背面朝向光源的面上,因为实际计算:

refelct(I,N)=I-2.0*点(N,I)*N
在背面,法向量指向远离光源的方向,但
refelct(I,N)=refelct(I,-N)
,因为:

I-2.0*点(N,I)*N==I-2.0*点(-N,I)*-N
在中,如果漫反射光>0,则仅添加镜面反射高光。例如:

for(int i=0;i0.0)
{
vec3 reflectDir=反射(-lightDir,正常);
浮动规格=功率(最大值(点(视图方向,反射方向),0.0),32.0f*光泽度);
镜面反射+=灯光[i]。镜面反射*(spec*材质镜面反射);
}
}