J'ai tracé un trapèze texturé, mais le résultat n'apparaît pas comme prévu. Au lieu d'apparaître comme un seul quadrilatère non rompu, une discontinuité se produit au niveau de la diagonale où se rencontrent ses deux triangles.Perspective texturation correcte du trapèze dans OpenGL ES 2.0
Cette illustration montre la question:
(Note:. La dernière image ne vise pas à être une représentation fidèle à 100%, mais il devrait obtenir le point à travers)
Le trapézoïdal est en cours d'élaboration en utilisant GL_TRIANGLE_STRIP
dans OpenGL ES 2.0 (sur un iPhone). Il est dessiné complètement en face de l'écran et n'est pas incliné (c'est-à-dire que ce n'est pas une esquisse 3D que vous voyez!)
Je comprends que j'ai besoin d'effectuer une "correction de perspective", vraisemblablement dans mon vertex et/ou fragment shaders, mais je ne sais pas comment faire cela. Mon code inclut des maths simples de matrices de Model/View/Projection, mais rien de cela n'influence actuellement mes valeurs de coordonnées de texture. Mise à jour: La déclaration précédente est incorrecte, selon le commentaire de l'utilisateur.
De plus, j'ai trouvé cette friandise dans la spécification ES 2.0, mais ne comprennent pas ce que cela signifie:
La correction PERSPECTIVE TRUC est pas pris en charge parce que OpenGL ES 2.0 exige que tous les attributs soient perspectivement interpolé.
Comment dessiner la texture correctement?
Edit: Ajout de code ci-dessous:
// 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);
}
La forme a-t-elle pris la forme d'un quad qui a été transformé et projeté, ou s'agit-il d'une forme 2D arbitraire? La solution la plus simple serait de rendre un quadrilatère incliné en 3D ... – JasonD
Vous devriez vérifier UV pour le deuxième triangle.Semble comme le décalage de texture –
Montrez-nous votre code. Regarde un peu _backshortened _... –