Jump to content
  • Advertisement
Sign in to follow this  
axel1994

OpenGL Drawing texture problem

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.

 

[attachment=19229:img_cheryl.jpg]

[attachment=19230:tex.png]

Edited by axel1994

Share this post


Link to post
Share on other sites
Advertisement

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!