【发布时间】:2015-08-13 15:21:53
【问题描述】:
我试图了解 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);
}
对于我的片段着色器,我在图片上创建了一个白色以在其中创建一个洞。 :
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;
-
我们为什么要使用负旋转光照?
LightDirection = (-rotationLight) * (gl_NormalMatrix);
-
为什么他们使用 *2.0 ) - 1.0 来计算法线向量? Normal = normalize(gl_NormalMatrix * gl_Normal); 不是不可能吗?
vec3 fvNormal = normalize((texture2D(bumpMap, Texcoord).xyz * 2.0) - 1.0);
【问题讨论】:
-
也许这只是我,但我认为你的问题太宽泛了。您告诉我们您了解基本概念,但是您的进一步问题并不是很具体。代码是照明模型的实现,我猜是 Phong,您可以在此处查看模型的工作原理:en.wikipedia.org/wiki/Phong_reflection_model 您需要对矩阵和矢量数学有基本的了解才能继续学习。了解模型后,请观察代码仅更改光的入射角度。也许您可以重新表述您的问题,或者从基础开始。
-
我更新了一些我不明白的细节。
-
@TimDirks 添加了答案,编辑了您的标签(添加 [glsl] 以启用语法突出显示)
标签: opengl opengl-es glsl shader ambient