【问题标题】:Why does these opengl rectangles not look the same?为什么这些opengl矩形看起来不一样?
【发布时间】:2020-01-20 20:37:52
【问题描述】:

我正在为 OpenGL 光照而苦苦挣扎。我启用了以下功能:

Specular[0] = 1f;
Specular[1] = 1f;
Specular[2] = 1f;
Specular[3] = 1f;
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, new float[] { 70 });
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, Specular);

Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, LightDef.LightPosToArray);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, LightDef.AmbientToArray);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, LightDef.DiffuseToArray);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glShadeModel(Gl.GL_SMOOTH);

当我绘制彼此相邻且大小相同的矩形时,一切看起来都很好。当我以不同的尺寸绘制它们时,每一个的照明都会发生变化。如何让它们看起来无缝?

Gl.glNormal3f(0, 0, 1);
Gl.glRectf(0, 0, 1000, 500);
Gl.glRectf(0, 500, 500, 1000);
Gl.glRectf(500, 500, 700, 700);

【问题讨论】:

    标签: opengl opengl-compat


    【解决方案1】:

    Legacy OpenGLlight 模型使用Gouraud Shading。为顶点计算光照并在多边形覆盖的片段上进行插值。
    镜面光取决于光源的位置或方向、表面的法向量和观察方向。由于每个顶点的观察方向不同,因此表面的光照也不同。
    与镜面光相比,漫射光不依赖于观察方向。它取决于光源的位置或方向以及表面的法向量。如果曲面的法向量相等且光源是定向光,则所有曲面上的光都相同。

    设置高光0:

    Specular[0] = 0f;
    Specular[1] = 0f;
    Specular[2] = 0f;
    Specular[3] = 0f;
    

    并确保光源是定向光(LightDef.LightPosToArray 的第 4 个分量必须为 0)。

    另一种选择是以这种方式细分较大的曲面,即与较小的曲面共享顶点。例如:

    +---+---+
    |   |   |
    +---+---+---+
    |   |   |   |
    +---+---+---+---+
    |   |   |   |   |
    +---+---+---+---+
    

    另见GLSL fixed function fragment program replacement

    【讨论】:

    • 谢谢。那么除了改变光照模型,有没有办法解决这个问题呢?改起来复杂吗?
    • @Electron8 使用漫反射光(镜面光 (0, 0, 0))和定向光源。差异是由镜面光和/或点光源引起的。
    • 哼..这让它们看起来完全平坦。
    • @Electron8 当然。它要么是平坦的,要么取决于顶点。如果您想要平滑的镜面高光和渐变过渡,则必须实现每个片段照明。您必须摆脱传统的灯光模型并实现Shader。请注意,灯光模型已被弃用,而不是最先进的。它的存在只是为了向后兼容。
    • 谢谢。我希望像 Gl.GlEnable(Gl.GL_FIX_THE_PROBLEM); :)
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多