如何在OpenGL中设置金属材料(如银)?有人知道吗?
答案 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。
此外,结合环境效果(立方体贴图或其他反射技术)突出了金属效果。