首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择光源进行Phong遮阳实现?

如何选择光源进行Phong遮阳实现?
EN

Stack Overflow用户
提问于 2018-12-29 17:30:26
回答 1查看 392关注 0票数 0

我试图实现Phong阴影模型,我不知道如何选择一个光源。更具体地说,我不明白光源应该是什么样子。应该是vec3吗?或者是我在Java代码中定义的矩阵?另外,如果我们假设我想要相机作为光源,那么与不同的光源有什么不同,比如在视野中的某个地方?我真的会接受一种解释,或者指导我应该如何解决这样的问题,而不仅仅是代码。

到目前为止,我在我的顶点着色器中拥有的是:

代码语言:javascript
复制
 #version 330
 layout(location=0) in vec3 vertex;
 layout(location=1) in vec3 normals;

 uniform mat4 viewMatrix;
 uniform mat4 projMatrix;

 out vec3 vertexColor;
 out vec3 pixelCoordinates;
 out vec3 normalizedNormals;

  void main(){

    if (gl_VertexID < 6) {
            vertexColor = vec3(1.0, 0.0, 0.0);
        } else if (gl_VertexID < 12) {
            vertexColor = vec3(0.0, 1.0, 0.0);
        } else if (gl_VertexID < 18) {
            vertexColor = vec3(0.0, 0.0, 1.0);
        } else if (gl_VertexID < 24) {
            vertexColor = vec3(1.0, 1.0, 0.0);
        } else if (gl_VertexID < 30) {
            vertexColor = vec3(1.0, 0.0, 1.0);
        } else {
            vertexColor = vec3(0.0, 1.0, 1.0);
        }



pixelCoordinates = vec3(viewMatrix*vec4(vertex,1.0));
normalizedNormals = normalize(mat3(viewMatrix)*normals);
gl_Position = projMatrix*viewMatrix*vec4(vertex, 1.0);

 }

这就是我的片段着色器现在的样子:

代码语言:javascript
复制
 #version 330

in vec3 vertexColor;
in vec3 pixelCoordinates;
in vec3 normalizedNormals;
out vec3 pixelColor;

void main(){



float il = 1;
float ia = 0.2;
float id ;

vec3 v = normalize(-pixelCoordinates);

}

当我编译时,我会得到一个黑色的屏幕,当然,这是因为我仍然错过了周围的光线和最后的光线,为此我需要设置一个光源。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-29 17:48:10

你可以定义的最简单的光源是定向光源。对于一个方向光,你所需要的是一个vec3,它包含光的方向。直接用该光方向计算Phong照明模型。

也要注意使用=>的特定方向向量

  1. 用指向光源的方向和面向观众的方向进行计算,或
  2. 用入射光方向和观众指向表面的方向执行计算。

我之所以提到这一点,是因为如果你搞砸了方向,两个向量之间的点积(余弦)将是负的。

在执行光照计算时,确保所有数据都在同一个空间中是非常重要的。也就是说,确保你的光的方向和你的顶点位置和你的观看者/摄像机的位置是相同的。

空间最明显的两个选择是:世界空间和视野空间。如果你选择世界空间,你可以把观看者/摄像机的位置作为制服,光线的方向保持不变;如果你要去观看空间,观众/摄像机将始终在(0,0,0),但你必须将每一帧的光方向转换成视场空间--在你的情况下,使用矩阵mat3(viewMatrix)应该能做到这一点,如果你不对场景使用非均匀缩放的话。

一旦您成功地计算了定向光的照明,您就可以继续使用其他光源,如点灯,这些光源主要由位置矢量定义(您也可以从位置矢量中计算每个顶点的方向矢量)。在互联网上有很多关于这个话题的好教程。

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

https://stackoverflow.com/questions/53971799

复制
相关文章

相似问题

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