openGL でのコーディングがどのように機能するかを理解しようとしています。インターネットでこのコードを見つけたので、明確に理解したいと思います。
私の頂点シェーダーには、次のものがあります。
バーテックス
uniform vec3 fvLightPosition;
varying vec2 Texcoord;
varying vec2 Texcoordcut;
varying vec3 ViewDirection;
varying vec3 LightDirection;
uniform mat4 extra;
attribute vec3 rm_Binormal;
attribute vec3 rm_Tangent;
uniform float fSinTime0_X;
uniform float fCosTime0_X;
void main( void )
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex * extra;
Texcoord = gl_MultiTexCoord0.xy;
Texcoordcut = gl_MultiTexCoord0.xy;
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
vec3 rotationLight = vec3(fCosTime0_X,0, fSinTime0_X);
ViewDirection = - fvObjectPosition.xyz;
LightDirection = (-rotationLight ) * (gl_NormalMatrix);
}
Fragment シェーダでは、画像に白い色を作成して穴を作成しました。:
uniform vec4 fvAmbient;
uniform vec4 fvSpecular;
uniform vec4 fvDiffuse;
uniform float fSpecularPower;
uniform sampler2D baseMap;
uniform sampler2D bumpMap;
varying vec2 Texcoord;
varying vec2 Texcoordcut;
varying vec3 ViewDirection;
varying vec3 LightDirection;
void main( void )
{
vec3 fvLightDirection = normalize( LightDirection );
vec3 fvNormal = normalize( ( texture2D( bumpMap, Texcoord ).xyz * 2.0 ) - 1.0 );
float fNDotL = dot( fvNormal, fvLightDirection );
vec3 fvReflection = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection );
vec3 fvViewDirection = normalize( ViewDirection );
float fRDotV = max( 0.0, dot( fvReflection, fvViewDirection ) );
vec4 fvBaseColor = texture2D( baseMap, Texcoord );
vec4 fvTotalAmbient = fvAmbient * fvBaseColor;
vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor;
vec4 fvTotalSpecular = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
if(fvBaseColor == vec4(1,1,1,1)){
discard;
}else{
gl_FragColor = ( fvTotalDiffuse + fvTotalSpecular );
}
}
すべてが何をしているのか、私に説明できる人はいますか? その基本的な考え方は理解しています。しかし、なぜそれが必要なのか、他の変数を使用するとどうなるのかということはあまりありません。何が起こるかというと、ティーポットの周りの光が来て、そのうちに消えていきます. これは、cosinus 変数と sinus 変数とどのように正しく関連付けられていますか? 光が上から来てティーポットの底に行きたい場合はどうすればよいですか?
また、
この行はどういう意味ですか?
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
そして、なぜここで変数の前にマイナスがあるのですか?
ViewDirection = - fvObjectPosition.xyz;
なぜ負のrotationLightを使用するのですか?
LightDirection = (-rotationLight ) * (gl_NormalMatrix);
法線ベクトルの計算に *2.0 ) - 1.0 を使用するのはなぜですか? Normal = normalize( gl_NormalMatrix * gl_Normal);ではそれは不可能ではありませんか? ?
vec3 fvNormal = normalize( ( texture2D( バンプマップ, Texcoord ).xyz * 2.0 ) - 1.0 );