0

正投影を使用しようとすると、探している結果が得られません。次の2D頂点とtexcoords(1行おきに)を含むVBOがあります。

0, 0,
0.0, 0.0,
512, 0,
1.0, 0.0,
512, 512,
1.0, 1.0,
0, 512,
0.0, 1.0

現時点ではglDrawArrays(GL_TRIANGLE_FAN, 0, 4); 、VBOを使用して描画しています(gDEBuggerで確認しました)。代わりに、頂点シェーダーに問題があるようです。

これは問題のあるシェーダーです。

#version 420

uniform mat4 projection;
uniform mat4 modelview;

layout(location = 0) in vec2 vertex;
layout(location = 1) in vec2 texcoord;

out vec2 f_texcoord;

void main() {
    const float right = 800.0;
    const float bottom = 600.0;
    const float left = 0.0;
    const float top = 0.0;
    const float far = 1.0;
    const float near = -1.0;

    mat4 testmat = mat4(
        vec4(2.0 / (right - left), 0, 0, -(right + left) / (right - left)),
                    vec4(0, 2.0 / (top - bottom), 0, -(top + bottom) / (top - bottom)),
                    vec4(0, 0, -2.0 / (far - near), -(far + near) / (far - near)),
                    vec4(0, 0, 0, 1)
    );
    gl_Position = testmat * vec4(vertex, 0.0, 1.0);
    f_texcoord = texcoord;
}

私は変換行列にあまり精通していないので、今学んでいます。正射影が必要な場合は、上記の行列を読んだことが正しいので、それを機能させることができないため、非常に混乱します。

これは問題を説明するための画像です:(テクスチャには透明な部分があることに注意してください)。

画像

編集: これは、変更された値でどのように見えるかです:

画像

4

2 に答える 2

4

GLSLの行列は列メジャーです。最初のvec4は、最初の行ではなく、最初のである必要があります。最後の座標はゼロである必要があります。

mat4 testmat = mat4(
    vec4(2.0 / (right - left), 0, 0, 0,
    vec4(0, 2.0 / (top - bottom), 0, 0),
    vec4(0, 0, -2.0 / (far - near), 0),
    vec4(-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1)
);

これは、標準のOpenGLglOrtho変換を使用します。原点は左下にあり、+ Xが右に、+Yが上になります。これはOpenGLの標準です。

+ Yを下げて左上の原点が必要な場合は、それに応じてマトリックスを調整する必要があります。

そうするための私のコードは次のとおりです。

Translate(-1.0f, 1.0f, (depthRange.x + depthRange.y) / 2.0f);
Scale(2.0f / size.x, -2.0f / size.y, 1.0f);

depthRange.x/yzNear/zFarの値はどこにありますか。size.x/yウィンドウの幅/高さです。Translate変換行列をScale作成し、スケール行列を作成します(これらは互いに右乗算されます)。

于 2011-11-09T21:19:49.303 に答える
0

問題は-行列の乗算です。変化する:

testmat * vec4(vertex, 0.0, 1.0);

に:

vec4(vertex, 0.0, 1.0) * testmat;
于 2016-02-29T14:09:18.817 に答える