【问题标题】:OpenGL ES - How to implement the Glossy Shader in Blender Cycles Render?OpenGL ES - 如何在 Blender Cycles Render 中实现光泽着色器?
【发布时间】:2015-01-13 20:37:00
【问题描述】:

Blender Cycles 渲染中,有一个名为Glossy 的着色器类型。现在我想在 Android 上使用 OpenGL ES 2.0 实现这个光泽着色器。我想知道在哪里可以找到这个着色器的 GLSL 实现?下面是显示光泽反射的图像(参见平面上的反射)。

【问题讨论】:

    标签: android opengl-es blender


    【解决方案1】:

    这种效果基本上只是一个高斯模糊滤镜。在这些文件的PowerVR SDK 中有一个很好的 OpenGL ES 2.0 示例:

    \Examples\Intermediate\Bloom\OGLES2\BlurVertShader.vsh:

    // Blur filter kernel shader
    //
    // 0  1  2  3  4
    // x--x--X--x--x    <- original filter kernel
    //   y---X---y      <- filter kernel abusing the hardware texture filtering
    //       |
    //      texel center
    //
    // 
    // Using hardware texture filtering, the amount of samples can be
    // reduced to three. To calculate the offset, use this formula:
    // d = w1 / (w1 + w2),  whereas w1 and w2 denote the filter kernel weights
    
    attribute highp   vec3  inVertex;
    attribute mediump vec2  inTexCoord;
    
    uniform mediump float  TexelOffsetX;
    uniform mediump float  TexelOffsetY;
    
    varying mediump vec2  TexCoord0;
    varying mediump vec2  TexCoord1;
    varying mediump vec2  TexCoord2;
    
    void main()
    {
        // Pass through vertex
        gl_Position = vec4(inVertex, 1.0);
    
        // Calculate texture offsets and pass through   
        mediump vec2 offset = vec2(TexelOffsetX, TexelOffsetY);
    
        TexCoord0 = inTexCoord - offset;
        TexCoord1 = inTexCoord;
        TexCoord2 = inTexCoord + offset;    
    
    }
    

    \Examples\Intermediate\Bloom\OGLES2\BlurFragShader.vsh:

    uniform lowp sampler2D  sTexture;
    
    /* 
      Separated Gaussian 5x5 filter, first row:         1  5  6  5  1
    */
    
    varying mediump vec2  TexCoord0;
    varying mediump vec2  TexCoord1;
    varying mediump vec2  TexCoord2;
    
    void main()
    {
        lowp vec3 color = texture2D(sTexture, TexCoord0).rgb * 0.333333;
        color = color + texture2D(sTexture, TexCoord1).rgb * 0.333333;
        color = color + texture2D(sTexture, TexCoord2).rgb * 0.333333;    
    
        gl_FragColor.rgb = color;
    }
    

    【讨论】:

    • 谢谢@ClayMontgomery,高斯模糊滤镜确实产生了一些模糊,但模糊还不够。通过添加 texCoord3、texCoord4...(采样更多相邻像素),模糊度会增加,但这需要更多的计算时间。我认为我们需要在这里进行大量采样才能获得上图中的效果,对吧?还有其他有效的方法吗?
    • 是的,一种更便宜的方法是增加“offset”的值。两者都可能需要获得您想要的结果。模糊滤镜的计算成本很高。您还可以通过渲染到附加纹理的 FBO 来通过多通道运行此操作,理论上可以通过无限通道提供无限模糊。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 2011-12-31
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多