首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用质心计算的光来实现平阴影?

如何用质心计算的光来实现平阴影?
EN

Stack Overflow用户
提问于 2013-11-28 00:54:44
回答 2查看 3.6K关注 0票数 2

我想写一个GLSL着色器程序,为每个脸阴影。我的第一次尝试使用了flat插值限定符和激发顶点。我使用平面插值的两个法线和位置顶点属性,这给我希望的老式效果的固体油漆表面。

虽然渲染看起来是正确的,但着色器程序实际上并没有完成正确的工作:

  1. 光的计算仍然是在每个碎片的基础上进行(在碎片着色器中),
  2. 位置矢量来自发人深省的顶点,而不是三角形的质心(对吗?)

是否可以将光照方程一次,应用于三角形的质心,然后用计算出的颜色值来表示整个原语?怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-28 02:09:41

使用输入为三角形,输出为三角形的几何图形着色器。将法线和位置从顶点着色器传递给它,自己计算质心(通过平均位置),并进行照明,将输出颜色作为输出变量传递给片段着色器,后者只是读取并写出它。

票数 3
EN

Stack Overflow用户

发布于 2013-11-28 04:53:26

另一种简单的方法是利用屏幕空间位置的导数来计算片段着色器中的(屏幕空间)表面法线。它的实现非常简单,甚至表现良好。

我编写了一个这里示例(需要一个具有WebGL功能的浏览器):

顶点:

代码语言:javascript
复制
attribute vec3 vertex;

uniform mat4 _mvProj;
uniform mat4 _mv;

varying vec3 fragVertexEc;

void main(void) {
    gl_Position = _mvProj * vec4(vertex, 1.0);
    fragVertexEc = (_mv * vec4(vertex, 1.0)).xyz;
}

碎片:

代码语言:javascript
复制
#ifdef GL_ES
precision highp float;
#endif

#extension GL_OES_standard_derivatives : enable

varying vec3 fragVertexEc;

const vec3 lightPosEc = vec3(0,0,10);
const vec3 lightColor = vec3(1.0,1.0,1.0);

void main()
{
    vec3 X = dFdx(fragVertexEc);
    vec3 Y = dFdy(fragVertexEc);
    vec3 normal=normalize(cross(X,Y));

    vec3 lightDirection = normalize(lightPosEc - fragVertexEc);

    float light = max(0.0, dot(lightDirection, normal));

    gl_FragColor = vec4(normal, 1.0);
    gl_FragColor = vec4(lightColor * light, 1.0);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20255919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档