Perspektivisch korrekte Texturierung des Trapezes in OpenGL ES 2.0

Ich habe ein strukturiertes Trapez gezeichnet, aber das Ergebnis sieht nicht so aus, wie ich es beabsichtigt hatte.

Anstatt als einzelnes ungebrochenes Viereck zu erscheinen, tritt eine Diskontinuität an der diagonalen Linie auf, an der sich die beiden Dreiecke treffen.

Diese Abbildung veranschaulicht das Problem:

(Hinweis: Das letzte Bild ist nicht als 100% originalgetreue Darstellung gedacht, aber es sollte den Punkt vermitteln.)

Das Trapez wird mit gezeichnetGL_TRIANGLE_STRIP in OpenGL ES 2.0 (auf einem iPhone). Es wird vollständig mit Blick auf den Bildschirm gezeichnet und nicht gekippt (d. H. Es ist keine 3D-Skizze, die Sie sehen!).

Ich habe verstanden, dass ich eine "Perspektivenkorrektur" durchführen muss, vermutlich in meinen Vertex- und / oder Fragment-Shadern, aber ich bin nicht sicher, wie ich das machen soll.

Mein Code enthält einige einfache Modell- / Ansichts- / Projektionsmatrix-Berechnungen, aber keine davon beeinflusst derzeit meine Texturkoordinatenwerte.Aktualisieren: Die vorige Aussage ist laut Kommentar des Nutzers infact falsch.

Außerdem habe ich dieses Leckerbissen in der ES 2.0-Spezifikation gefunden, verstehe aber nicht, was es bedeutet:

Der PERSPEKTIVE KORREKTURTIPP wird aus folgenden Gründen nicht unterstütztOpenGL ES 2.0 erfordert, dass alle Attribute perspektivisch interpoliert werden.

Wie kann ich die Textur korrekt zeichnen lassen?

Bearbeiten: Code unten hinzugefügt:

// 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);

}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage