首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在这个Phong Shader上做错什么了?

我在这个Phong Shader上做错什么了?
EN

Stack Overflow用户
提问于 2022-06-06 22:08:33
回答 1查看 64关注 0票数 0

我已经尝试了一段时间来调试这个简单的,但是我发现它很短。弥漫性部分很好,但镜面不是。它不会和摄像机一起移动。

从一边来:

和这里来自另一个:

据我所见,我确实把这个位置转换成了Viewspace,但是,很显然,我犯了另一个错误。

顶点着色器:

代码语言:javascript
复制
#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);
}

我的碎片着色器

代码语言:javascript
复制
#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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-07 15:52:53

除了拉比德76的答案,还有一件事情是错误的,那就是if(dot(rVec,vVec) < 0.0)正在测试两者之间的角度是否大于90度。换句话说,您正在测试模型后面是否可见镜面反射。你必须把它从小于--而不是--转换成--比>更大。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72523922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档