opengl 我在这个Phong Shader中做错了什么?

a6b3iqyw  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(138)

我一直在调试这个简单的Phong-Shader,但结果很差。漫反射部分没问题,但镜面反射部分不行。它不随相机移动。
"这是从一个方面“

“另一个”

据我所知,我确实将“位置”转换为“视图空间”,但是,显然,我犯了另一个错误。
顶点着色器:


# version 330

# extension GL_ARB_explicit_attrib_location : enable

layout(location=0) in vec3 aPosition;
layout(location=1) in vec3 aNormal;

out vec3 vPosition;
out vec3 vNormal;

uniform mat4 uModel;
uniform mat4 uView;
uniform mat4 uProjection;

void main(void) 
{
    vPosition = vec3(uModel * vec4(aPosition,1.0f));
    vNormal =   vec3(uModel * vec4(aNormal,  0.0f));
    gl_Position = uProjection * uView * uModel * vec4(aPosition, 1.0);
}

我的碎片着色器


# version 330

out     vec4 FragColor;

in      vec3 vPosition;
in      vec3 vNormal;

uniform mat4 uView;
uniform vec3 uColor;
uniform vec3 uLightpositions[10];
uniform vec3 uLightcolors[10];
uniform float uPhongSpecular;

void main(void)
{
    FragColor = vec4(0.4*uColor, 1.0);//Ambient Value
    for(int i = 0; i < 5; i++){
        vec3 lVec = normalize(uLightpositions[i] - vPosition);
        vec3 nVec = normalize(vNormal);

        float diffuse = max(dot(lVec,nVec), 0);
        FragColor += 0.5* vec4(uLightcolors[i] * diffuse,0.0f);

        vec3 rVec = normalize(reflect(lVec,nVec));
        vec3 vVec = -normalize(vec3(uView * vec4(vPosition,1.0)));

        float specular = 0;
        if(dot(rVec,vVec) < 0.0)
        {
            specular = pow(max(dot(-rVec,vVec),0),uPhongSpecular);
        }
        FragColor += 0.2*vec4(uLightcolors[i] * specular,0.0f);
    }
}
tgabmvqs

tgabmvqs1#

问题是dot(-rVec, vVec)vVec是视图空间中的向量,而rVec是世界空间中的向量。将rVec从世界空间转换到视图空间:
vec3 rVec = normalize(reflect(lVec, nVec));

vec3 rVec = normalize(mat3(uView) * reflect(lVec, nVec));
dvtswwa3

dvtswwa32#

除了Rabbid76的答案之外,还有一点是错误的,那就是if(dot(rVec,vVec) < 0.0)测试的是两者之间的夹角是否大于90度。换句话说,你测试的是模型后面的镜面反射是否可见。你必须把它从小于翻转到大于>

相关问题