2012-01-18 50 views
1

我是OpenGL ES 2.0世界中的新投标。我正尝试在iOS平台上使用OpenGL ES 2.0实现高光贴图。据我所知,在镜面映射中,我们从镜面反射贴图纹理中提取光的镜面反射分量的值。我在顶点着色器中所做的事情如下: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

那么你的计算看起来很合理。问题是,你在做每个顶点的照明。这意味着每个顶点计算照明(就像你在顶点着色器中做的那样)并且在三角形内插。因此,您的照明质量高度依赖于网格的曲面细分质量。

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

所以第一步就是将光照计算移动到片段着色器中。在顶点着色器中,您只需计算N,LE(不要忘记标准化)并将它们作为变化排列。在片段着色器中,基于插值的N,LE(不要忘记再次重新归一化),执行剩余的计算。

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

+0

嗨Christian Rau,根据你的回复我把我的照明计算转移到片段着色器。还有一件事,我想问你从凹凸贴图。我也想实施凹凸贴图。我研究了一些关于凹凸贴图的知识,其中大部分内容都很清晰。我使用OBJ来渲染几何。我很难找到凹凸映射所需的每个顶点切线。你似乎有很好的专业知识,所以请给你宝贵的建议,找到凹凸贴图所需的每个顶点切线..... – hurricane 2012-01-24 15:39:17

+0

@hurricane这肯定会值得另一个问题,但首先你可以看看[这里](http: //www.terathon.com/code/tangent.html)和[这里](http://fabiensanglard.net/bumpMapping/index.php)。这个想法是计算每个三角形的切线和双切线(因为它们每个三角形都是不变的,并且取决于三角形顶点的纹理坐标),然后平均每个顶点所有相邻三角形的切线。 – 2012-01-24 15:54:45

+0

@hurricane那么高光贴图现在能够正确工作吗?如果是,投票和接受总是赞赏。如果没有,请随时更新您的问题或写评论。 – 2012-01-24 16:03:21