3 votes

Mappage de texture sur un cylindre

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.

In the first image the tiles on the less curved part are square

while where the curvature is higher they are more stretched

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) ?

2voto

Bartek Banachewicz Points 13173

Vous pouvez modifier les coordonnées de la texture pour la "rétrécir" un peu sur un objet. Ce que vous ne pouvez pas faire, c'est paramétrer les coordonnées de la texture pour qu'elle soit mise à l'échelle de façon non linéaire.

Donc, les options sont :

  1. Quantifier l'échantillonnage, en modifiant les coordonnées de la texture pour mieux tenir compte de la non-circularité ( dynamique, mais la qualité est faible lorsque l'on utilise une tesselation à faible polystructure ; c'est la solution la plus simple à mettre en œuvre, cependant ).
  2. Utilisez le fragment shader pour mettre à l'échelle les coordonnées de la texture de manière non linéaire ( peut-être un peu plus compliqué, mais dynamique et donnant d'assez bons résultats, en fonction de la taille de la texture, du filtrage utilisé et du contenu de la texture( ! ) )
  3. Modifier la texture ( solution statique - ne fonctionne que pour un rapport Ra/Rb donné. Cependant, la qualité sera la meilleure possible ).

Quant au scintillement sur les bords, vous devez générer des mipmaps pour vos textures.

Faites-moi savoir si vous avez besoin de plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X