現実世界では、太陽や照明からの光が様々な物体に反射して光が直接当たらない場所でも
間接的に反射してきた光によってある一定の明るさになっています。
この空間に溢れる光を環境光といいます。
CGでこれを再現するにはラジオシティやグローバルイルミネーションなどがありますが、
計算コストが非常に高く、ゲームなどのリアルタイムな画面更新が求められるプログラムでは
とても使う事はできません。
そこで、一般的には割とそれらしく見せるためにシーン全体に影響する一定の色を環境光として
使います。
vec4 ambient = gl_FrontLightProduct[0].ambient; で、OpenGLからアンビエント情報を受け取ります。
これを紐解いていくと、
glLightfv(GL_LIGHT0, GL_AMBIENT, Light); で設定したライトの光の範囲内で
glMaterialfv(GL_FRONT,GL_AMBIENT,Ambient); の反射をします。
一般的に使用される環境光の正体がわかりましたね? その実体は、ただの色です。
これに拡散反射光や鏡面反射光などを掛け合わせて、より、それらしく見えるようにするのが
一般的な方法です。
vertex.shader
void main(void) { vec4 ambient = gl_FrontLightProduct[0].ambient; gl_FrontColor = ambient; gl_Position = ftransform();//クリップ空間へ } |
GLSL.h
#pragma once
|
main.cpp
#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") #include <stdio.h> #define WIDTH 320 GLSL glsl; void setLight(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //回転 glutSwapBuffers(); } |