OpenGL ES 2.0中的镜面映射

时间:2012-01-18 13:16:10

标签: opengl-es-2.0

我是OpenGL ES 2.0世界的新竞标者。我试图在iOS平台上使用OpenGL ES 2.0实现镜面映射。据我所知,在镜面映射中,我们从镜面贴图纹理中提取光的镜面反射分量的值。我在顶点着色器中做的事情如下:

vec3 N = NormalMatrix * Normal;
vec3 L = normalize(LightPosition);
vec3 E = normalize(EyePosition);
vec3 H = normalize(L + E);
vec4 Specular=(texture2D(sampler_spec, TextureCoordIn)).rgba;

float df = max(0.0, dot(N, L));
float sf = max(0.0, dot(N, H));
sf = pow(sf, Specular.a);

vec3 color = AmbientMaterial + df * DiffuseMaterial + sf * Specular.rgb * SpecularMaterial;

DestinationColor = vec4(color, 1);  `

但我在游戏中看不到任何镜面效果。我不知道我哪里错了。请提出宝贵的建议。

1 个答案:

答案 0 :(得分:1)

你的计算看起来很合理。问题是,你正在做每顶点照明。这意味着每个顶点计算光照(正如您在顶点着色器中所做的那样)并在三角形中进行插值。因此,您的照明质量在很大程度上取决于网格的镶嵌质量。

如果您有相当大的三角形,那么像镜面高光这样的高频效果就不会真正显示出来。特别是在使用纹理时。请记住,使用纹理的原因是在子三角形级别提供表面细节,但是在您每个顶点读取纹理时,镜面可能只是顶点属性。

因此,第一步是将照明计算移动到片段着色器中。在顶点着色器中,您只需计算NLE(不要忘记进行标准化)并将它们作为变化进行计算。在片段着色器中,您可以根据插值的NLE进行剩余的计算(不要忘记再次重新规范化)。

如果所有这些变化和每片段光照的概念目前都有点高,那么你应该深入研究着色器的基础知识,并在简单的每片段光照着色器上寻找教程。这些可以很容易地适应镜面映射或凹凸贴图等......