2012-04-22 563 views
2

如何在OpenGL中为金属(如银)设置材质?有谁知道?如何在OpenGL中设置金属材质(如银色)?

+0

为什么不使用您在网上找到的金属质感并将其应用于您的物体? – Chris911 2012-04-22 02:08:49

+0

着色器+纹理..如果你感觉很勇敢,那么光线追踪也是如此。 – jli 2012-04-22 02:09:34

+6

你不只是调用'glEnable(GL_METAL)'。模仿金属或任何真实世界的物质是一件复杂的事情,它可以用各种方式近似以获得不同程度的准确性。因此,如果不了解整体问题的范围,就无法回答这个问题。 – 2012-04-22 02:16:24

回答

4

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

8

如何在OpenGL中为金属(如银)设置材质?有谁知道?

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

如果你希望你的材质看起来更像金属,但是在某些光照条件下,你需要编写像素着色器,它将使用照片级真实纹理的银色,额外的纹理贴图来控制镜面颜色和强度。只要照明条件被精心挑选,一个好的纹理可以让你摆脱可怕而简单的着色器。这就要求程序员具有GLSL的知识和一个好的艺术家来制作纹理,艺术家将变得更加重要 - 即使像像素phong这样的非金属着色器也可以通过手动调整来看起来像你想要的(进动可能会很无聊和乏味)。着色器本身只需要使用镜面反射(任何镜面反射)的每像素光照,正常映射支持和环境反射映射(使用菲涅耳术语支持)。将HDR用于弱反射抛光表面也将有所帮助。

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

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

所以,你可以用它们任何地方,包括materials.h激活物质,当你需要它:

例子:

#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(); 
... 
... 

是比较容易,如果你想的对象。

0

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

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

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

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

相关问题