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

如何在OpenGL中设置金属(如银)的材质?,opengl,lighting,Opengl,Lighting,如何在OpenGL中设置金属银材质?有人知道吗?如果您检查,您可以找到一系列不同的材质设置,用于模拟各种材质,包括银色。但是,正如其他人在评论中所说,请记住,Phong shading(OpenGL使用类似于此的材质设置)很难以逼真的方式渲染某些真实世界的物质,尤其是反射性物质,如银色。但该网站的材质设置应该会给你一些银色的东西,至少是一级近似值。如果您可以选择不同的材质设置来模拟各种材质(包括银色),请确保您在结尾处注意到将光泽度乘以128。但是,正如其他人在评论中所说,请记住,Phong s

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

如果您检查,您可以找到一系列不同的材质设置,用于模拟各种材质,包括银色。但是,正如其他人在评论中所说,请记住,Phong shading(OpenGL使用类似于此的材质设置)很难以逼真的方式渲染某些真实世界的物质,尤其是反射性物质,如银色。但该网站的材质设置应该会给你一些银色的东西,至少是一级近似值。如果您可以选择不同的材质设置来模拟各种材质(包括银色),请确保您在结尾处注意到将光泽度乘以128。但是,正如其他人在评论中所说,请记住,Phong shading(OpenGL使用类似于此的材质设置)很难以逼真的方式渲染某些真实世界的物质,尤其是反射性物质,如银色。但该网站的材质设置应该会给你一些银色的东西,至少是一级近似值。确保你在最后注意到了关于将光泽度乘以128的注释

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

如果希望材质有时看起来有点像金属,则需要设置相应的漫反射、环境光、镜面反射和光泽度参数。您可以研究现有的3d编辑器材质库,如,并了解它们是如何做到这一点的。这很便宜,但看起来也很便宜。我想,通常是低GL_亮度值为3..12的材料?看起来有点像金属表面

如果希望材质看起来更像金属,但在特定的照明条件下,则需要编写像素着色器,该着色器将使用银色的照片级真实感纹理,以及控制镜面反射颜色和强度的附加纹理贴图。一个好的纹理可以让你摆脱可怕和简单的着色器,只要照明条件被仔细选择。这需要有GLSL知识的程序员和一个好的艺术家来制作纹理,而艺术家将更为重要——即使是像每像素phong这样的非金属材质也可以手动微调,使其看起来像你想要的那样。过程可能会很无聊和乏味。着色器本身只需要具有镜面反射的每像素照明(任何镜面反射、法线贴图支持)和具有菲涅耳术语支持的环境反射贴图。将HDR用于弱反射抛光表面也会有所帮助

如果你想要真正完美的白银,那么你就有麻烦了,应该重新考虑。金属表面有模糊反射,这可能是一个痛苦的快速实施,取决于您的硬件。另一个问题是,你必须对金属本身进行大量研究,检查存在的每个金属表面演示,阅读GDC论文等。也就是说,进行研究,这可能需要花费大量时间/精力,最终不会有回报,因为最终结果很可能会有糟糕的性能。重要的是,你不需要模拟真实的材料,使它看起来正确-你需要欺骗观众认为这是银

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

如果希望材质有时看起来有点像金属,则需要设置相应的漫反射、环境光、镜面反射和光泽度参数。您可以研究现有的3d编辑器材质库,如,并了解它们是如何做到这一点的。这很便宜,但看起来也很便宜。我想,通常是低GL_亮度值为3..12的材料?看起来有点像金属表面

如果希望材质看起来更像金属,但在特定的照明条件下,则需要编写像素着色器,该着色器将使用银色的照片级真实感纹理,以及控制镜面反射颜色和强度的附加纹理贴图。一个好的纹理可以让你摆脱可怕和简单的着色器,只要照明条件被仔细选择。这需要有GLSL知识的程序员和一个好的艺术家来制作纹理,而艺术家将更为重要——即使是像每像素phong这样的非金属材质也可以手动微调,使其看起来像你想要的那样。过程可能会很无聊和乏味。着色器本身只需要具有镜面反射的每像素照明(任何镜面反射、法线贴图支持)和具有菲涅耳术语支持的环境反射贴图。将HDR用于弱反射抛光表面也会有所帮助

如果你想要真正完美的白银,那么你就有麻烦了,应该重新考虑。金属表面有模糊反射,这可能是一个痛苦的快速实施,取决于您的硬件。另一个问题是,您必须对金属本身进行大量研究,检查存在的每个金属表面演示,阅读GDC论文等,即进行研究,这可能需要花费大量的时间/精力
d最终不会有回报,因为最终结果很可能会有糟糕的表现。重要的是,你不需要模拟真实的材料,使它看起来正确-你需要欺骗观众认为这是银

正如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
#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...
恩迪夫

因此,您可以在任何地方使用它们,包括材质。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();
...
...

如果考虑对象,则更容易。

正如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
#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...
恩迪夫

因此,您可以在任何地方使用它们,包括材质。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();
...
...

如果考虑对象,则更容易。

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

反照率漫反射色; 法线映射; 粗糙度-地图表面粗糙度/平滑度; 金属性-金属/非金属区域的地图表面; 网上有很多关于PBR的文章。其中一个可能最受欢迎的是这个


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

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

反照率漫反射色; 法线映射; 粗糙度-地图表面粗糙度/平滑度; 金属性-金属/非金属区域的地图表面; 网上有很多关于PBR的文章。其中一个可能最受欢迎的是这个


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

为什么不使用在线找到的金属纹理并将其应用于对象?着色器+纹理。。如果你觉得自己很勇敢的话,也可以用射线追踪。你不能只称之为glEnableGL_金属。模仿金属或任何真实世界的物质是一件复杂的事情,可以用各种方法来近似,以获得不同程度的精确度。因此,如果不进一步了解整个问题的范围,就无法回答此问题。@Chris911:为什么不使用金属纹理,因为纹理不发光。为什么不使用在线找到的金属纹理并将其应用于对象?着色器+纹理。。如果你觉得自己很勇敢的话,也可以用射线追踪。你不能只称之为glEnableGL_金属。模仿金属或任何真实世界的物质是一件复杂的事情,可以用各种方法来近似,以获得不同程度的精确度。因此,如果不了解整个问题的范围,就无法回答这个问题。@Chris911:为什么不使用金属纹理呢?因为纹理没有光泽。