【问题标题】:Specular Mapping in OpenGL ES 2.0OpenGL ES 2.0 中的高光映射
【发布时间】:2012-01-18 21:50:55
【问题描述】:

我是 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);  `

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

【问题讨论】:

    标签: opengl-es-2.0


    【解决方案1】:

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

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

    所以第一步是将光照计算移到片段着色器中。在顶点着色器中,您只需计算NLE(不要忘记标准化)并将它们作为变量输出。在片段着色器中,您将根据插值的NLE 执行其余的计算(不要忘记再次重新规范化)。

    如果目前所有这些变化和逐片段照明的概念都有些牵强,您应该更深入地研究着色器的基础知识,并查找有关简单的逐片段照明着色器的教程。然后这些可以很容易地适应高光贴图或凹凸贴图,...

    【讨论】:

    • 嗨,Christian Rau,根据您的回复,我在片段着色器中更改了光照计算。关于凹凸贴图,我还想问你一件事。我也想实现凹凸贴图。我研究了一些关于凹凸贴图的知识,大部分内容都很清楚。我正在使用 OBJ 来渲染几何图形。我很难找到凹凸贴图所需的每个顶点切线。你似乎有很好的专业知识,所以请给你宝贵的建议,以寻找凹凸贴图所需的每个顶点切线.....
    • @hurricane 这肯定值得另一个问题,但首先你可以查看herehere 的公式。这个想法是计算每个三角形的切线和双切线(因为它们是每个三角形的常数,并且取决于三角形顶点的纹理坐标),然后对每个顶点的所有相邻三角形的切线进行平均。
    • @hurricane 那么高光贴图现在可以正常工作了吗?如果是,那么总是赞赏投票和接受。如果没有,请随时更新您的问题或发表评论。
    • 正如你所说的高光贴图效果还取决于三角形的大小,我还没有尝试使用较小的三角形几何体的代码,如果它适用于投票,我肯定会感谢你的建议。 ...:)
    • @hurricane 不!我说过像镜面光照或聚光灯这样的效果在很大程度上取决于镶嵌质量如果在顶点着色器中完成。每个片段光照计算的优点是光照更独立于网格的镶嵌质量,这就是我建议它的原因。所以你的高光贴图现在应该可以工作了(当然,如果你有一个合理的高光贴图)。寻找GouraudPhong 阴影之间的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2014-07-14
    相关资源
    最近更新 更多