Jump to content

  • Log In with Google      Sign In   
  • Create Account


Drawing texture problem


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 axel1994   Members   -  Reputation: 423

Like
0Likes
Like

Posted 25 December 2013 - 03:01 PM

Hello,

 

I got a problem when I'm trying to draw a texture on a object (a rectangle in this case)

I don't think there is any problem in the shaders, but I'll give them either way.

Vertex shader:

#version 330

layout (location=0) in vec3 position;
layout (location=1) in vec2 uvcoor0;

out vec2 uvcoor;

void main() {
	gl_Position = vec4(position, 1.0);
	uvcoor = uvcoor0;
}

Fragment shader:

#version 330

uniform sampler2D tex;
in vec2 uvcoor;                                                                 
                                                                                   
void main() {                                                                                  
	gl_FragColor = texture2D(tex, uvcoor.st);                                                 
}

The code I'm using:

For the uv buffer

here I have an struct where I store the length and the actual uv coordinates

texturecoor.len = 4;
Vector2f vec;
texturecoor.texcor = new Vector2f[4];
vec.x = 1;
vec.y = 1;
texturecoor.texcor[0] = vec;
vec.x = 0;
vec.y = 1;
texturecoor.texcor[1] = vec;
vec.x = 1;
vec.y = 0;
texturecoor.texcor[3] = vec;
vec.x = 0;
vec.y = 0;
texturecoor.texcor[2] = vec;

The vertex and index coordinates are located in an .obj file that I load.

That works correctly (since I can draw the rect with a color instead of a texture.

Here is the obj file,

The index int are read in the exact same order.

Each vertex line is in xyz

# Blender v2.69 (sub 0) OBJ File: ''
# www.blender.org

o Plane
v 1.000000 1.000000 0.000000
v -1.000000 1.000000 0.000000
v 1.000000 -1.000000 0.000000
v -1.000000 -1.000000 0.000000

f 2 3 0
f 1 0 3

Loading the texture I use:

str is the relative path, load_image returns an image object that stores the width, height and data

GLuint texture;
image img = load_image(str);

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, img.width, img.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, img.data);

destroyImg(img);

return texture;

loading everything into opengl I use the code:

(this is after I loaded all data in the buffers)

but for reference, here is my loading of my uvbuffer

(ttx is the data of the uv coordinates)

glGenBuffers(1, &uvbuffer);

glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(ttx), ttx, GL_DYNAMIC_DRAW);
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);

glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

if (uv) {
	glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
	glEnableVertexAttribArray(1);
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
}

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuffer);
glBindVertexArray(0);

When rendering I bind the texture, bind the vao and draw all triangles: (nbElem is the number of index elements)

glActiveTexture(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//bind the vao (didnt copy that line of code)
glDrawElements(GL_TRIANGLES, nbElem, GL_UNSIGNED_INT, 0);

The included pictures are:

the image I load in

the image resulting on the screen

(I got the image from some examples pictures that came with the image loading lib I'm using)

 

It's not correct, but it also draws the image twice.

Once normally and once turned 90 degrees

 

what I've tried doing is, changing the texture coordinates order.

But the order I have now (0,1,3,2) gives the best result.

 

I also have a world matrix to represent a camera.
I multiple this camera with only the vertices (not with the uv coordinates)

 

Even without using the camera, I get exactly the same result.

Another issue, which I believe is part of this problem.

 

If I zoom out with my camera, the texture changes.

The more zoomed out, the more correct the image is displaying.

 

I did check the camera. But without a texture the camera works perfectly.

 

My apologies if I didn't include enough information.

 

img_cheryl.jpg

tex.png


Edited by axel1994, 25 December 2013 - 03:02 PM.

"Talk is cheap. Show me the code."

- Linus Torvalds

Sponsor:

#2 Samith   Members   -  Reputation: 2251

Like
2Likes
Like

Posted 25 December 2013 - 03:46 PM

I took a glance at your code, it all looks pretty good except one thing. This bit of code to set up the texture coordinate attribute looks wrong:

if (uv) {
	glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
	glEnableVertexAttribArray(1);
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); // 3 components? Should be 2, since you only declare uvcoor0 as a vec2
}

Looks like that should read glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); since your texture coordinates are only two components wide.



#3 axel1994   Members   -  Reputation: 423

Like
0Likes
Like

Posted 25 December 2013 - 03:53 PM

I took a glance at your code, it all looks pretty good except one thing. This bit of code to set up the texture coordinate attribute looks wrong:

if (uv) {
	glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
	glEnableVertexAttribArray(1);
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); // 3 components? Should be 2, since you only declare uvcoor0 as a vec2
}

Looks like that should read glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); since your texture coordinates are only two components wide.

Ow, damn

Thank you so much. biggrin.png

 

Can't believe I spend 2 days looking for that.

Now It works perfectly.

 

I now found that the order of texture coordinates should be 0,1,2,3.

Now the image shows amazing.

 

It works great along with the camera


Edited by axel1994, 25 December 2013 - 03:55 PM.

"Talk is cheap. Show me the code."

- Linus Torvalds




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS