Perspektywa poprawnego teksturowania trapezu w OpenGL ES 2.0

Narysowałem trapez teksturowany, ale wynik nie wygląda tak, jak zamierzałem.

Zamiast pojawiać się jako pojedynczy nieprzerwany czworobok, nieciągłość występuje na linii ukośnej, gdzie spotykają się jej dwa trójkąty.

Ta ilustracja pokazuje problem:

(Uwaga: ostatni obraz nie ma być w 100% wiernym odwzorowaniem, ale powinien wskazać cały punkt).

Trapez jest rysowany za pomocąGL_TRIANGLE_STRIP w OpenGL ES 2.0 (na iPhone). Jest rysowany całkowicie twarzą do ekranu i nie jest przechylany (tzn. Nie jest to szkic 3D, który widzisz!)

Doszedłem do zrozumienia, że ​​muszę wykonać „korektę perspektywy”, prawdopodobnie w moim cieniu wierzchołków i / lub fragmentów, ale nie jestem pewien, jak to zrobić.

Mój kod zawiera prostą matematykę macierzy Model / View / Projection, ale żadna z nich nie wpływa obecnie na moje wartości współrzędnych tekstury.Aktualizacja: Poprzedni komentarz jest niepoprawny, według komentarza użytkownika.

Ponadto znalazłem ten smakołyk w specyfikacji ES 2.0, ale nie rozumiem, co to znaczy:

WSKAZÓWKA PERSPEKTYWY KOREKCJI nie jest obsługiwana, ponieważOpenGL ES 2.0 wymaga, aby wszystkie atrybuty były perspektywicznie interpolowane.

Jak mogę poprawnie narysować teksturę?

Edytować: Dodano kod poniżej:

// Vertex shader
attribute vec4 position;
attribute vec2 textureCoordinate;

varying vec2 texCoord;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    texCoord = textureCoordinate;
}
// Fragment shader
uniform sampler2D texture;
varying mediump vec2 texCoord;

void main()
{
    gl_FragColor = texture2D(texture, texCoord);
}
// Update and Drawing code (uses GLKit helpers from iOS)

- (void)update
{
    float fov = GLKMathDegreesToRadians(65.0f);
    float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
    projectionMatrix = GLKMatrix4MakePerspective(fov, aspect, 0.1f, 50.0f);
    viewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); // zoom out
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(shaders[SHADER_DEFAULT]);

    GLKMatrix4 modelMatrix = GLKMatrix4MakeScale(0.795, 0.795, 0.795); // arbitrary scale

    GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(viewMatrix, modelMatrix);

    GLKMatrix4 modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);
    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, GL_FALSE, modelViewProjectionMatrix.m);

    glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_WALLS]);
    glUniform1i(uniforms[UNIFORM_TEXTURE], 0);

    glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, wall.vertexArray);
    glVertexAttribPointer(ATTRIB_TEXTURE_COORDINATE, 2, GL_FLOAT, GL_FALSE, 0, wall.texCoords);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, wall.vertexCount);

}

questionAnswers(3)

yourAnswerToTheQuestion