如何在OpenGL中设置金属材料(如银)?

时间:2012-04-22 02:06:27

标签: opengl lighting

如何在OpenGL中设置金属材料(如银)?有人知道吗?

4 个答案:

答案 0 :(得分:8)

  

如何在OpenGL中设置金属材料(如银)?有人知道吗?

如果您希望您的材料有时看起来像金属一样“有点”,则需要设置相应的漫反射,环境光,镜面反射和“光泽”参数。您可以调查blender等3d编辑器的现有材料库,看看他们是如何做到的。这很便宜,但看起来也很便宜。通常具有低GL_SHININESS值(3..12,我认为?)的材料看起来像金属表面“有点”。

如果您希望您的材质看起来更像金属,但在某些光照条件下,您需要编写像素着色器,它将使用逼真的银色纹理,以及控制镜面反射颜色和强度的其他纹理贴图。只要仔细选择照明条件,良好的纹理就可以让您摆脱可怕且简单的着色器。这需要具有GLSL知识的程序员和一个优秀的艺术家来制作纹理,而艺术家将更加重要 - 即使像每像素phong这样的非金属着色器也可以手工微调,看起来像你想要的(进动可能很无聊)和乏味的。着色器本身仅需要具有镜面(任何镜面反射),正常映射支持和环境反射映射(具有菲涅耳术语支持)的每像素照明。使用HDR进行弱反射抛光表面也会有所帮助。

如果你想要真实和完美的白银,那么你就麻烦了,应该重新考虑。金属表面具有“模糊”反射,根据您的硬件,可能很难快速实施。另一个问题是你必须要研究金属本身,检查那里存在的每个金属表面演示,阅读GDC论文等等。做研究,这可能需要花费很多时间/精力,最终不会得到回报,因为最终结果很可能会有可怕的表现。重要的是你不需要模拟真实的材料来使它看起来正确 - 你需要欺骗观众认为这是银色的。

答案 1 :(得分:4)

如果选中this site,您可以找到一系列旨在模仿各种材料的不同材料设置,包括银色。然而,正如其他人在评论中所说的那样,请记住Phong着色,这是OpenGL使用这样的材料设置做的事情,很难以逼真的方式呈现某些真实世界的物质,特别是像银这样的反光物质。但是那个站点的材料设置应该给你一些银色的东西,至少是第一次近似。 (确保你最后记下关于将光泽乘以128的注释)

答案 2 :(得分:0)

正如Solaraeus所说,你可以制作一个“材料”类来定义一个物质对象,例如:

#ifndef _MATERIAL
#define _MATERIAL
#include <GL/gl.h>

class material{

  private:

    GLfloat ambient_r;
    GLfloat ambient_g;
    GLfloat ambient_b;

    GLfloat diffuse_r;
    GLfloat diffuse_g;
    GLfloat diffuse_b;

    GLfloat specular_r;
    GLfloat specular_g;
    GLfloat specular_b;


public:

    material(GLfloat ar, GLfloat ag, GLfloat ab, GLfloat dr, GLfloat dg, GLfloat db, GLfloat sr, GLfloat sg, GLfloat sb){
        ambient_r=ar;   ambient_g=ag;   ambient_b=ab;
        diffuse_r=dr;   diffuse_g=dg;   diffuse_b=db;
        specular_r=sr;  specular_g=sg;  specular_b=sb;
    }

    void active(){
        GLfloat ambient[]={ambient_r, ambient_g, ambient_b, 1.0};
        glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
        GLfloat diffuse[]={diffuse_r, diffuse_g, diffuse_b};
        glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
        GLfloat specular[]={specular_r, specular_g, specular_b};
        glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
    }
};

#endif

您可以使用多种材料定义文件.h以供日后使用,例如:

#ifndef _MATERIALS
#define _MATERIALS
#include "material.h"

                        // ### specification of materials ### //

material turquesa(0.1, 0.18725, 0.1745, 0.396, 0.74151, 0.69102, 0.297254, 0.30829, 0.306678);
material esmeralda(0.0215, 0.1745, 0.0215, 0.07568, 0.61424, 0.07568, 0.633, 0.727811, 0.633);
material jade(0.135, 0.2225, 0.1575, 0.54, 0.89, 0.63, 0.316228, 0.316228, 0.316228);
material obsidian(0.05375, 0.05, 0.06625, 0.18275, 0.17, 0.22525, 0.332741, 0.328634, 0.346435);
//more and more...

#ENDIF

因此,您可以在任何地方使用它们,包括在需要时激活材料的材料。

示例:

#include "materials.h"
...
...
turquesa.active();

        glBegin(GL_TRIANGLES);
            for(unsigned i=0; i<faces.size(); i++){
                glNormal3f(x, y, z); 
                glVertex3f(x, y, z);
                glVertex3f(x, y, z);
                glVertex3f(x, y, z); 
            }
        glEnd();
...
...

如果你考虑对象会更容易。

答案 3 :(得分:0)

使用PBR - 基于物理的渲染技术可以获得高质量的金属外观。 基本上,PBR使用着色器和以下纹理输入:

  • 反照率(漫反射)颜色;
  • 法线贴图;
  • 粗糙度 - 地图表面粗糙度/光滑度;
  • 金属度 - 金属/无金属区域的地图表面;

网上有很多关于PBR的文章。可能最喜欢的一个是one

此外,结合环境效果(立方体贴图或其他反射技术)突出了金属效果。