0

最初の段階で長方形メッシュの頂点の位置を生成し、それらを 2D float テクスチャに格納する 2 つ以上のパス レンダリングがあります。シェーダーは次のようになります。

バーテックス:

#version 330 core
out vec2 vfTexCoords;

const float halfSide = 1.0f;
const vec2[] pos = vec2[ 4 ]
(
    vec2( -halfSide, -halfSide ),
    vec2(  halfSide, -halfSide ),
    vec2(  halfSide,  halfSide ),
    vec2( -halfSide,  halfSide )
);

const vec2[] tex = vec2[ 4 ]
(
    vec2( 0.0f, 0.0f ),
    vec2( 1.0f, 0.0f ),
    vec2( 1.0f, 1.0f ),
    vec2( 0.0f, 1.0f )
);

void main()
{
    vfTexCoords = tex[ gl_VertexID ];
    gl_Position = vec4( pos[ gl_VertexID ], 0.0f, 1.0f );
}

断片:

in vec2 vfTexCoords;

layout (location = 0) out vec3 pos;

void main()
{
    pos = vec3( vfTexCoords, 0.0f );
}

出力 2D float テクスチャは、長方形の頂点メッシュの寸法にサイズ変更され、FBO のカラー アタッチメントの 1 つにバインドされます。したがって、FBO サイズはテクスチャ サイズから継承されます。

ビューポートは、長方形メッシュのサイズと同じ寸法になるように設定されています。

glViewport( 0, 0, horizontalVerticesCount, verticalVerticesCount );

これで、ビューポートとテクスチャの両方が同じサイズになりました。

glDrawArrays( GL_TRIANGLE_FAN, 0, 4 );

... テクスチャ座標は 0.0、0.0 から 1.0、1.0 まで変化するため、出力頂点の位置は vec3(0.0, 0.0, 0.0) から vec3(1.0, 1.0, 0.0) の範囲である必要があります。

奇妙なのは、フラグメント シェーダーからの出力頂点位置の x 値と y 値がゼロ以外から始まり、それらの最大値が 1.0 未満であることです。2 x 2 メッシュの場合: 左下: vec3( 0.25, 0.25, 0.0 ) ( 0.5 / mesh_side = 0.5 / 2 = 0.25 ) 右上: vec3( 0.75, 0.75, 0.0 )

16 x 16 メッシュの場合: 左下: vec3( 0.03125, 0.03125 , 0.0 ) ( 0.5 / mesh_side = 0.5 / 16 = 0.03125 ) 右上: vec3( 0.96875, 0.96875, 0.0 )

頂点シェーダーの位置を vec3(-1.0, -1.0, 0.0) から vec3(1.0, 1.0, 0.0) に設定すると、ビューポート全体に「描画」していることになります。頂点シェーダーの位置を変更すると、フラグメント シェーダーからの出力値が異なります。

上記のコードの何が問題で、描画が 0.5 / rect_mesh_side_length から始まるのはなぜですか?

最初に投稿された質問は次のとおりです。

助言がありますか?

4

1 に答える 1

3

フラグメント シェーダーの入力は、ピクセルの中心で補間されています。OpenGL 4.5 仕様 ( https://www.opengl.org/registry/doc/glspec45.core.pdf ) のセクション 15.2.2「Shader Inputs」では、この動作とその制御方法について詳しく説明しています。

これは、説明のために簡単に作成した図です。

ダイアグラム

グリッドの次元は既にわかっているので、それらを一様変数として渡し、フラグメント シェーダーで次のコードを使用できます。これにより、0.0 から 1.0 までの座標が得られます。

vec2 coord = floor(gl_FragCoord.xy) / vec2(horizontalVerticesCount - 1.0, verticalVerticesCount - 1.0);
于 2015-01-20T15:33:24.847 に答える