Hi,
Thanks for this wonderful forum. This is my first message in these forums. It looks like that here is plenty of professional guys, who could answer my little problem. Here it comes.. :P
I´m trying to make a little 2d engine with OpenGL (just testing). I saw a very nice texture streching (or is it distorting? I don´t know, I´m not English) effect and I decided to add it to my "engine". I´m trying to draw a quad with texture. The speciality is that the quad is not an ordinary rectangle. The user can grab every corner and stretch the quad. It´s hard to tell you what I mean so here is the image:
(made with PhotoShop CS).
However, OpenGL draws quad as two rectangles and uses intependent texture coordinates for both of triangles so the current result is not what I´m searching for. As you can see, the other triangle´s texture is streched more than other´s:
As I told you, I´m using 2d projection (glOrtho). I´ve set my ortho coordinates so that the top left corner is (0,0) and the bottom right corner is (w,h). Here is my OpenGL setup code:
// setup OpenGL
glViewport(0, 0, width, height);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
if( relative ) gluOrtho2D(0, 1.0, 1.0, 0);
else gluOrtho2D(0, width, height, 0);
I´m using DevIL as my image library and it sets some texture setting at the loading, so I´m gonna give you the loading code too. First my custom loading in the main function:
GLuint text = 0;
ILuint img = 0;
ilGenImages(1, &img);
ilBindImage(img);
if( !ilLoadImage( "test.png" ) )
{
std::fstream file;
file.open( "err.log", std::fstream::out );
ILenum error = ilGetError ();
if (error != IL_NO_ERROR) {
do {
file << iluErrorString(error);
} while ((error = ilGetError ()));
}
return 1;
}
text = ilutGLBindTexImage();
ilDeleteImages(1, &img);
And here is the DevIL loading method:
GLuint ILAPIENTRY ilutGLBindTexImage()
{
GLuint TexID = 0, Target = GL_TEXTURE_2D;
ILimage *Image;
Image = ilGetCurImage();
if (Image == NULL)
return 0;
if (ilutGetBoolean(ILUT_GL_AUTODETECT_TEXTURE_TARGET)) {
if (HasCubemapHardware && Image->CubeFlags != 0)
Target = ILGL_TEXTURE_CUBE_MAP;
}
glGenTextures(1, &TexID);
glBindTexture(Target, TexID);
if (Target == GL_TEXTURE_2D) {
glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(Target, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
else if (Target == ILGL_TEXTURE_CUBE_MAP) {
glTexParameteri(Target, GL_TEXTURE_WRAP_S, ILGL_CLAMP_TO_EDGE);
glTexParameteri(Target, GL_TEXTURE_WRAP_T, ILGL_CLAMP_TO_EDGE);
glTexParameteri(Target, ILGL_TEXTURE_WRAP_R, ILGL_CLAMP_TO_EDGE);
}
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SWAP_BYTES, IL_FALSE);
if (!ilutGLTexImage(0)) {
glDeleteTextures(1, &TexID);
return 0;
}
return TexID;
}
And finally, here is the code the game loop, which handles the drawing:
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, text);
glBegin(GL_QUADS);
glTexCoord2f (0.0f, 0.0f); glVertex2f(10,110);
glTexCoord2f (0.0f, 1.0f); glVertex2f(10,10);
glTexCoord2f (1.0f, 1.0f); glVertex2f(310,10);
glTexCoord2f (1.0f, 0.0f); glVertex2f(110,110);
glEnd();
glfwSwapBuffers();
Ok. This was my problem. I hope you can give a solution. Sorry for my bad English..
Thanks beforehand.