为啥,当我缩放多边形时,我的光强度会发生变化?

Posted

技术标签:

【中文标题】为啥,当我缩放多边形时,我的光强度会发生变化?【英文标题】:Why, when i scale polygons my light intensity changes?为什么,当我缩放多边形时,我的光强度会发生变化? 【发布时间】:2019-05-03 17:00:14 【问题描述】:

我需要在 OpenGL 项目中轻松更改我的多边形比例,但由于某种原因,光照强度与多边形的大小成正比。

我试图将光的方向移动到不同的地方。在 scaler 上更改光照强度和 div 法线向量,但没有帮助。

在我的代码中 scaler 表示多边形压缩 => 如果 scaler = 2 , poly 变成 0.5 的大小

顶点坐标:

verticesMatrix[i][k] = new Vector3f((float) (i - cellCount / 2) / scaler, 
                      (float) 0, (float) (k - cellCount / 2) / scaler);

计算法线:

 public void calcNormal(Vector3f s1, Vector3f s2, Vector3f s3) 
        Vector3f a = new Vector3f(s2.x - s1.x, s2.y - s1.y, s2.z - s1.z);
        Vector3f b = new Vector3f(s3.x - s2.x, s3.y - s2.y, s3.z - s2.z);
        Vector3f normal = new Vector3f(a.y * b.z - a.z * b.y, a.z * b.x - a.x 
        * b.z, a.x * b.y - a.y * b.x);
        glNormal3f(normal.x, normal.y, normal.z);
    

灯光设置:

private static float[] lightPosition = -2.19f, 100.36f, 11.45f, 1f;

 private static void setUpLighting() 
        glShadeModel(GL_SMOOTH);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glLightModel(GL_LIGHT_MODEL_AMBIENT, 
        BufferTools.asFlippedFloatBuffer(new float[]0.0f, 0.0f, 0.0f, 1f));
        glLight(GL_LIGHT0, GL_POSITION, 
        BufferTools.asFlippedFloatBuffer(lightPosition));
        glEnable(GL_CULL_FACE);
        glCullFace(GL_BACK);
        glEnable(GL_COLOR_MATERIAL);
        glColorMaterial(GL_FRONT, GL_DIFFUSE);
    

我需要使用不同的缩放器获得相同的光线。我不知道它如何影响光线,因为我检查了所有代码,并且我不使用带有光线的缩放器。结果图片:https://yadi.sk/i/kxQLvRSTP7LYVA

【问题讨论】:

scaler 影响顶点的坐标。更接近这些坐标的光(lightPosition 保持不变)会改变强度,因为它是“点光”而不是“定向光”。参见 glLight 的用法 @genpfault 你为什么删除你的答案?可能你是对的。我认为这是一个很好的收获。 calcNormal() 实际上会发出单位长度的法线吗?看起来它只是一个交叉产品,没有看到任何(重新)标准化的尝试。输入总是单位长度吗? @Ripi2 光是按顶点计算的 (Gouraud shading)。漫反射部分是法向量和光向量的点积。所以光强取决于法向量与光向量的夹角,而不取决于顶点坐标到光源位置的距离。对于距离依赖性,必须设置(更改)*ATTENUATION 参数。 @Rabbid76 我承认我对 OGL 1.1 很笨拙。但是对于 w != 0 会考虑衰减。如glLight doc 所述(下至 GL_POSITION) 【参考方案1】:

我需要像这样正常化:

public void calcNormal(Vector3f s1, Vector3f s2, Vector3f s3) 
        Vector3f a = new Vector3f(s2.x - s1.x, s2.y - s1.y, s2.z - s1.z);
        Vector3f b = new Vector3f(s3.x - s2.x, s3.y - s2.y, s3.z - s2.z);
        Vector3f normal = new Vector3f(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
        float length = (float)Math.pow(normal.x * normal.x + normal.y * normal.y + normal.z * normal.z, 0.5f); 
        glNormal3f(normal.x / length, normal.y / length, normal.z / length);
    

【讨论】:

以上是关于为啥,当我缩放多边形时,我的光强度会发生变化?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:启用多重采样会在高缩放级别为多边形绘制混乱的边缘

标记拖动后,即使多边形线也不会根据标记改变

为啥使用 FFmpeg 缩放时帧数会发生变化?

倒回多边形的索引

Android Maps V2:缩小时多边形填充消失

使用增强几何缓冲区缩放多边形时的冗余顶点