OpenGL ES - 如何在 Blender Cycles Render 中实现光泽着色器?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 来通过多通道运行此操作,理论上可以通过无限通道提供无限模糊。

以上是关于OpenGL ES - 如何在 Blender Cycles Render 中实现光泽着色器?的主要内容,如果未能解决你的问题,请参考以下文章

使用来自blender 2.62+的.obj文件,在java中使用Eclipse for Android openGL ES

在OpenGL ES(Android)中使用带纹理的索引缓冲区有什么意义吗?

Blender源码分析之OpenGL基本例子

在 OpenGL 中使用 Blender/SketchUp 模型

Blender源码分析之OpenGL基本例子

Blender源码分析之OpenGL函数初步