簡體   English   中英

opengl 燈減少反射

[英]opengl light reduce reflection

我試圖在我的場景中應用一盞燈。 然而,所有物體都反射得非常厲害,顏色會失真。

在此處輸入圖片說明

我怎樣才能得到類似於這個例子的反射:

在此處輸入圖片說明

我假設我為材料選擇了錯誤的值?

這是我設置燈光和材料的方式:

void createLight() {

    GLfloat mat_specular[] = {0.3, 0.3, 0.3, 1.0};
    GLfloat mat_shininess[] = { 1.0 };
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    glEnable(GL_COLOR_MATERIAL);

    // Lighting set up
    glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    // Set lighting intensity and color
    GLfloat qaAmbientLight[]    = {0.2, 0.2, 0.2, 1.0};
    GLfloat qaDiffuseLight[]    = {0.8, 0.8, 0.8, 1.0};
    GLfloat qaSpecularLight[]   = {1.0, 1.0, 1.0, 1.0};
    glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight);
    glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight);

    // Set the light position
    GLfloat qaLightPosition[]   = {12, 8, 12, 0.4};
    glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition);

}

光的值太高了。 請注意,在標准燈光模型中,燈光的環境光、漫反射和鏡面反射部分是相加的。

標准的 OpenGLBlinn-Phong光模型計算如下:

Ka ... ambient material
Kd ... difusse material
Ks ... specular material

La ... ambient light
Ld ... diffuse light
Ls ... specular light
sh ... shininess

N  ... norlmal vector 
L  ... light vector (from the vertex postion to the light) 
V  ... view vector (from the vertex psotion to the eye)

Id    = max(dot(N, L), 0.0);

H     = normalize(V + L);
NdotH = max(dot(N, H), 0.0);
Is    = (sh + 2.0) * pow(NdotH, sh) / (2.0 * 3.14159265);

fs    = Ka*La + Id*Kd*Ld + Is*Ks*Ls;

由於您的鏡面反射光值由{1.0, 1.0, 1.0, 1.0};初始化{1.0, 1.0, 1.0, 1.0}; ,在對象的法線向量指向光的情況下,這可能會給出大於 1.0 的總和。 這導致渲染的對象看起來幾乎是白色的。

我建議使用小的環境光部分,因為它獨立於入射光添加到整個對象。

使用強朗伯漫反射光組件,它可以很好地反射光的方向。
請參閱如何在 aerotwist 上偽造燈光?

對於鏡面光組件,您必須進行實驗。 它的效果很大程度上取決於光澤度參數。 但是首先使用一個小的鏡面光值和大約 10.0 的光澤度。

GLfloat mat_shininess[]   = {10.0};
GLfloat qaAmbientLight[]  = {0.2, 0.2, 0.2, 1.0};
GLfloat qaDiffuseLight[]  = {0.6, 0.6, 0.6, 1.0};
GLfloat qaSpecularLight[] = {0.3, 0.3, 0.3, 1.0};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM