0

OpenGL ES2.0 の GLSL でフラグメント シェーダーを作成するのは初めてで、特定のグラフィックのベベル効果を作成するフラグメント シェーダーを作成しようとしています。これまでに私ができることは次のとおりです(下の壁やその他のテクスチャリングは無視して、ベベル効果が適用されている上部のみを見てください):

電流出力

望ましい結果は次のとおりです。

望ましい出力

対角線でのシェーディングの違いに注意してください。それらは、水平方向のエッジよりもシェーディングが薄くなります。斜めのエッジから水平または垂直への移行に注目してください。また、ベベルの厚みにも注意してください。この望ましい結果にできるだけ近づけたいと思います。

現在、私が使用しているフラグメント シェーダーは非常に単純です。コードは次のとおりです。

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform float u_time;

void main()
{
    vec2 onePixel = vec2(0, 1.0 / 640.0);

    vec2 texCoord = v_texCoord;

    vec4 color;
    color.rgb = vec3(0.5);
    color += texture2D(s_texture, texCoord - onePixel) * 5.0;
    color -= texture2D(s_texture, texCoord + onePixel) * 5.0;

    color.rgb = vec3((color.r + color.g + color.b) / 3.0);
    gl_FragColor = vec4(color.rgb, 1);
}

目的の効果を作成するには、シェーダーに何を追加する必要がありますか?

4

2 に答える 2

0

あなたが示した例は、フ​​ラグメントシェーダーコードで完全に行われたわけではないと思います. ES には存在しないことを除いて、ジオメトリ シェーダーによって行うことができるジオメトリのベベルによって行われた可能性が高いため、Blender などのオーサリング ツールを使用してモデルにベベルを行うか、テクスチャを使用して行うことになります。バンプ マッピング技術。

于 2013-06-23T00:55:03.977 に答える
0

ベベル効果を得る最適な方法は、Blender または他のエディターでメッシュを変更することです。

シェーダーでこれを実現したい場合は、エッジを非表示にするために特別に用意されたバンプ マップを使用することで可能になる場合があります。

マルチパスとレンダー バッファ ソリューションがいくつかあるかもしれませんが、それらについてはあまり知りません。深度バッファからエッジを見つけることができます。しかし、それはパフォーマンスの点で最良の方法ではありません。

私は最近、特別なテクスチャやジオメトリを変更せずにベベル効果を持つ方法を見つけました (そのため、この質問に答えています:)。ただし、頂点データを変更する必要があります。実際には、他の法線ベクトルを各頂点に追加する必要があります。そのため、メッシュをそのシェーダー専用に変換する必要があります。論文

于 2018-02-20T16:52:11.920 に答える