# OpenGL Stretch a texture on a 2D polygon

This topic is 2328 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi,

I have a texture that I am able to display on a 2D square (easy). I want also to stretch that texture on a custom 2D polygon in order to fill it:
- Without losing pixels in the process (yes, the texture *will* be distorted and this is what I need)
- Without converting the texture (I need to display the same texture on a square and on a custom polygon at the same time)

Example picture of what I want to achieve:

I can't seem to find how to do this with OpenGL. Can it be done with shaders only? Any other ideas?

##### Share on other sites
if you have enough vertices inside the poligon (so a dense grid) you need only to move vertices.
Else you have to do some math based-distortion (like following a spline, sinus wave) wich gives you some limits on wich distortion you can achieve (and only possible with a pixel shader)..

you can of course use te math based -distortion inside vertex shader if you have a dense grid or a tessellated polygon.

By the way adjusting manually vertices is the simplest option to achieve that I think, and give you total control on the distortion that you want to achieve (not very good for real time applications, so that's why using a shader is preferrable even if limited in complexity) Edited by DemonRad

##### Share on other sites
As demonRad said, it can be achieved in a shader, but for your needs, i'd think that'd be a bit overkill.

As he also said, the general approach is to build a grid of vertice's and distort the grid in the direction you need, for example:

the uv's along the grid should be mapped from 0-1, and the best way to draw it is probably a triangle strip.

still, this is only one approach of many possible ways.

##### Share on other sites

Currently, I create the following VBO square with 2 triangles:

GLfloat vertices[] = {

-1.0, -1.0,
-1.0, 1.0,
1.0, -1.0,
1.0, 1.0
};

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

Then I create my texture data coords:

GLfloat texcoords[] = {

0.0, 0.0,
0.0, 1.0,
1.0, 0.0,
1.0, 1.0,
};
glGenBuffers(1, &vbo_texcoords);
glBindBuffer(GL_ARRAY_BUFFER, vbo_texcoords);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, GL_STATIC_DRAW);

When I render, everything looks fine (the weird texture is actual data rendered to a 2d buffer):

Now I add vertexes and bend them to create another shape:

GLfloat vertices[] = {
-1.0, -0.5,
-0.2, 1.0,
-0.5, -1.0,
-0.1, 0.9,
0.5, -1.0,
0.1, 0.9,
1.0, -0.5,
0.2, 1.0,
};

GLfloat cube_texcoords[] = {
0.00, 0.0,
0.00, 1.0,
1.0/3.0, 0.0,
1.0/3.0, 1.0,
2.0/3.0, 0.0,
2.0/3.0, 1.0,
1.00, 0.0,
1.00, 1.0,

};

Result is not that ok (purple lines added in paint):

Note how the texture orientation is wrong in the smaller triangles. I render the shape using GL_TRIANGLE_STRIP. The order of the vertexes seems fine though. What went wrong?

In the end , what I'd like to achieve is exactly this: http://vimeo.com/38715344

Note how the shape (the video in this case -- on my side, it's a 2D buffer with rendered data) is distorted without clipping of the actual texture.

Thanks!

1. 1
2. 2
3. 3
frob
20
4. 4
Rutin
18
5. 5

• 32
• 13
• 10
• 9
• 18
• ### Forum Statistics

• Total Topics
632555
• Total Posts
3007061

×