2012-04-22 568 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

此外,結合環境影響(立方體地圖或其他反射技術)突出了金屬效果。

相關問題