Je veux appliquer une texture uniforme en damier à la surface d'un cylindre d'une hauteur de 10 cm. h
et semiradii (a,b)
.
J'ai implémenté ce shader :
Vertex shader :
varying vec2 texture_coordinate;
float twopi = 6.283185307;
float pi=3.141592654;
float ra = 1.5;
float rb= 1.0;
void main()
{
// Transforming The Vertex
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// -pi/2 < theta < pi/2
float theta = (atan2( rb*gl_Vertex.y , ra*gl_Vertex.x)+pi*0.5)/pi;
// Passing The Texture Coordinate Of Texture Unit 0 To The Fragment Shader
texture_coordinate = vec2( theta , -(-gl_Vertex.z+0.5) );
}
Fragment shader :
varying vec2 texture_coordinate;
uniform sampler2D my_color_texture;
void main()
{
// Sampling The Texture And Passing It To The Frame Buffer
gl_FragColor = texture2D(my_color_texture, texture_coordinate);
}
tandis que du côté client j'ai spécifié les options suivantes :
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
Ma texture est un damier de 3768x1200. Maintenant, je voudrais que la texture soit appliquée de manière à garder le damier uniforme (carrés sans étirement), mais j'obtiens un rapport d'aspect correct uniquement dans la partie la moins incurvée de la surface, tandis que sur les parties plus incurvées, les carreaux sont étirés.
J'aimerais comprendre comment appliquer la texture sans la déformer et l'étirer, peut-être en répétant la texture au lieu de l'étirer.
J'ai aussi un problème de scintillement étrange sur les bords de la texture, là où les deux bords se croisent, comment le résoudre (on peut le voir dans la deuxième image) ?