首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GGX着色器创作

GGX着色器创作
EN

Stack Overflow用户
提问于 2018-12-18 01:43:53
回答 1查看 386关注 0票数 1

我正在尝试创建一个ggx着色器,但是当我在上运行它时,主页仍然是白色的。我正在努力找出我的错误,但我做不到。有人能帮我吗?下面是我的档案

分析性

代码语言:javascript
复制
::begin parameters

float baseColor 0.001 .2 .1

float m 0.001 0.1 1.0 

::end parameters

::begin shader

    const float PI = 3.14;


    vec3 BRDF( vec3 N, vec3 V, vec3 L, float m, float baseColor)
        {

            vec3 H = normalize(V+L);

            float dotNL = clamp(dot(N,L), 0.0, 1.0);
            float dotLH = clamp(dot(L,H), 0.0, 1.0);
            float dotNH = clamp(dot(N,H), 0.0, 1.0);

            float DotNH2 = dotNH * dotNH;
            float m2 = m * m;
            float D =  m2 / (PI * pow(dotNH * dotNH * (m2 - 1) + 1, 2.0));


            float Fresnel(float baseColor, float l, float h)
        {
            return baseColor + ( 1 - baseColor ) * pow( 1 - (dotNH), 5);
        }
            float F = Fresnel(baseColor, dotNH);


            float ggx_visib(float dotNV, float m2) 
        { 
            return 1.0/(dotNV*(1.0-m2)+m2); 
        }                       

            float g1i =ggx_visib(m, dotLH);
            float g1o =ggx_visib(m, dotNV);
            float G = g1i * g1o;



        return D * G * F * (1.0 / (4.0 * dotNL * dotNV));


        }

::end shader
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 05:58:32

在函数BRDF的中间有两个函数声明。这是不允许的。在GLSL中,函数定义必须是全局的。

请参阅GLSL - OpenGL阴影语言4.6;6.1。函数定义.第122页

正如上面的语法所指出的,有效的着色器是一系列全局声明和函数定义。

Fresnelggx_visib的声明移到BRDF声明之前,以解决问题。

主要问题是,BRDF探险家需要在文件开始时使用关键字analytic来将文件识别为轻量级模型。

添加关键字后,添加重新加载的文件,应用程序将跟踪GLSL代码导致的错误。

修复错误将导致以下代码:

代码语言:javascript
复制
analytic

::begin parameters

float baseColor 0.001 .2 .1

float m 0.001 0.1 1.0

::end parameters

::begin shader

const float PI = 3.14;

float Fresnel(float baseColor, float l, float h)
{
    return baseColor + ( 1 - baseColor ) * pow( 1 - (h), 5);
}

float ggx_visib(float dotNV, float m2) 
{ 
    return 1.0/(dotNV*(1.0-m2)+m2); 
} 

vec3 BRDF( vec3 N, vec3 V, vec3 L, vec3 X, vec3 Y)
{
    vec3 H = normalize(V+L);

    float dotNL = clamp(dot(N,L), 0.0, 1.0);
    float dotLH = clamp(dot(L,H), 0.0, 1.0);
    float dotNH = clamp(dot(N,H), 0.0, 1.0);

    float DotNH2 = dotNH * dotNH;
    float m2 = m * m;
    float D =  m2 / (PI * pow(dotNH * dotNH * (m2 - 1) + 1, 2.0));

    float F = Fresnel(baseColor, dotNL, dotNH);

    float g1i =ggx_visib(m, dotLH);
    float g1o =ggx_visib(m, dotNH);
    float G = g1i * g1o;

    float k = D * G * F * (1.0 / (4.0 * dotNL * dotNH));
    return vec3(k);
}
::end shader
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53825287

复制
相关文章

相似问题

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