# OpenGL quad rendering to ortho view set to my window leaves lines between quads

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

## Recommended Posts

Hi, when I render quads to my ortho view (set up as (0, window_x_size), (0, window_y_size), (-1, 1)) opengl leaves a blank line between neighbouring quads.

heres my ortho matrix setup:

matrix4x4 &matrix4x4::make_ortho(float left_, float right_,
float top_, float bottom_, float near_, float far_)
{
zero();

mat[0] = 2.0f / (right_ - left_);
mat[5] = 2.0f / (top_ - bottom_);
mat[10] = -2.0f / (far_ - near_);
mat[12] = -((right_ + left_) / (right_ - left_));
mat[13] = -((top_ + bottom_) / (top_ - bottom_));
mat[14] = -((far_ + near_) / (far_ - near_));
mat[15] = 1.0f;

return *this;
}

I call the above with make_ortho(0, 600, 0, 400, -1, 1) where the window size is 600 x 400.

This is the contents of my vertex array right before I enable the vertex attrib array and glVertexAttribPointer it.

(2 quads, one under the other)


verts : (0, 300, 0)
verts : (19, 300, 0)
verts : (19, 319, 0)
verts : (0, 319, 0)
verts : (0, 320, 0)
verts : (19, 320, 0)
verts : (19, 339, 0)
verts : (0, 339, 0)



Unfortunately, this is leaving a blank line between the top quad and the bottom one and I can't see why.

My vertex shader: (trans is set to my ortho matrix)

#version 330

uniform mat4 trans;

in vec3 pos;
in vec3 color;

out vec3 frag_color;

void main()
{
gl_Position = trans * vec4(pos, 1.0);

frag_color = color;
}




#version 330

in vec3 frag_color;

out vec4 out_color;

void main()
{
out_color = vec4(frag_color, 1.0);
}



Everything works fine (quad placement is correct, color is correct), except there is a blank (black) horizontal line between the 2 quads.

Any help would be appreciated.

##### Share on other sites

You draw two 19x19 pixel-sized quads spaces 20 pixels apart, so yes there's going to be a single pixel spacing between them. I assume you want the quads to be 20x20 so they line up perfectly, so you need to make the quads extend from 300 to 320 and from 320 to 340, respectively, in the Y-direction. And, of course, extend from 0 to 20 in the X-direction.

##### Share on other sites

I thought the quads were 20 pixels, 0..19 is 20 units no?

##### Share on other sites

OpenGL coordinates are for the bottom-left of the pixel. So drawing a line from 0,0 to 1,1 fills exactly one pixel (in screen coordinates).

Put another way, image a piece of graph paper, with 0,0 at the bottom-left. If you draw a line to 1,1 you will get a diagonal line in the first grid square - it will not extend into the square at 1,1 as below.

|_|_|_

|_|_|_

|/|_|_

The diagonal represents a line from 0,0 to 1,1 - filling exactly 1 pixel at coordinate 0,0

Edited by mark ds

##### Share on other sites

I see. Thank you.

##### Share on other sites

You have your projection set up to map one unit to one pixel. Your quad is 19-0=19 units, and thus 19 pixels. You can look at it from another point also, first quad extends from 300 to 319, but the second quad starts at 320 and ends at 399. But what about the one unit gap from 319 to 320? That gap is 320-319=1 unit, and thus the gap is one pixel.

What you are probably misunderstanding here is that your coordinates are pixel coordinates; they are not. Pixels are discrete rectangles with a defined size, but the coordinate system is continuous. That is, there are no fractional pixels, but there are fractional coordinates that is located within the small boundary rectangle defined by a pixel. The quad you specify determines the boundary of the shape that is subsequently rasterized such that all pixels inside the boundary is drawn.

Let's make the numbers a bit more reasonable for an example and make a small picture. Here's a 5x4 pixel grid, with coordinates ranging from 0 to 5 along the X-axis, and from 0 to 5 along the Y-axis. Now draw a rectangle from (1,1) to (4,3) and observe which pixels are drawn. Also observe that the pixel centers are not located at integer coordinates; pixel boundaries are located at integer coordinates. The X's indicate which pixels are drawn.

[pre]

4 +---+---+---+---+---+
|   |   |   |   |   |
3 +---+---+---+---+---+
|   | X | X | X |   |
2 +---+---+---+---+---+
|   | X | X | X |   |
1 +---+---+---+---+---+
|   |   |   |   |   |
0 +---+---+---+---+---+
0   1   2   3   4   5

[/pre]

##### Share on other sites

And with regards to mark ds' reply, he's talking about lines which (as well as points) have different rasterization rules than filled primitives. His example does not apply in this particular case and is not the reason for the gap or missing pixels. His information is not wrong though, just that lines does not apply in this case.

##### Share on other sites

And with regards to mark ds' reply, he's talking about lines which (as well as points) have different rasterization rules than filled primitives. His example does not apply in this particular case and is not the reason for the gap or missing pixels. His information is not wrong though, just that lines does not apply in this case.

I should have been clearer - I wasn't referring to OpenGL lines, just the concept that only one grid square (pixel) was actually touched when going from 0,0 to 1,1

##### Share on other sites

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

## Create an account

Register a new account

• ### Similar Content

• By xhcao
Does sync be needed to read texture content after access texture image in compute shader?
My simple code is as below,
glUseProgram(program.get());
glBindImageTexture(0, texture[0], 0, GL_FALSE, 3, GL_READ_ONLY, GL_R32UI);
glBindImageTexture(1, texture[1], 0, GL_FALSE, 4, GL_WRITE_ONLY, GL_R32UI);
glDispatchCompute(1, 1, 1);
// Does sync be needed here?
glUseProgram(0);
GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture[1], 0);
glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);

Compute shader is very simple, imageLoad content from texture[0], and imageStore content to texture[1]. Does need to sync after dispatchCompute?

• My question: is it possible to transform multiple angular velocities so that they can be reinserted as one? My research is below:

• I have this code below in both my vertex and fragment shader, however when I request glGetUniformLocation("Lights[0].diffuse") or "Lights[0].attenuation", it returns -1. It will only give me a valid uniform location if I actually use the diffuse/attenuation variables in the VERTEX shader. Because I use position in the vertex shader, it always returns a valid uniform location. I've read that I can share uniforms across both vertex and fragment, but I'm confused what this is even compiling to if this is the case.

#define NUM_LIGHTS 2
struct Light
{
vec3 position;
vec3 diffuse;
float attenuation;
};
uniform Light Lights[NUM_LIGHTS];

• By pr033r
Hello,
I have a Bachelor project on topic "Implenet 3D Boid's algorithm in OpenGL". All OpenGL issues works fine for me, all rendering etc. But when I started implement the boid's algorithm it was getting worse and worse. I read article (http://natureofcode.com/book/chapter-6-autonomous-agents/) inspirate from another code (here: https://github.com/jyanar/Boids/tree/master/src) but it still doesn't work like in tutorials and videos. For example the main problem: when I apply Cohesion (one of three main laws of boids) it makes some "cycling knot". Second, when some flock touch to another it scary change the coordination or respawn in origin (x: 0, y:0. z:0). Just some streng things.
I followed many tutorials, change a try everything but it isn't so smooth, without lags like in another videos. I really need your help.
My code (optimalizing branch): https://github.com/pr033r/BachelorProject/tree/Optimalizing
Exe file (if you want to look) and models folder (for those who will download the sources):
http://leteckaposta.cz/367190436
Thanks for any help...

• By Andrija
I am currently trying to implement shadow mapping into my project , but although i can render my depth map to the screen and it looks okay , when i sample it with shadowCoords there is no shadow.
Here is my light space matrix calculation
mat4x4 lightViewMatrix; vec3 sun_pos = {SUN_OFFSET * the_sun->direction[0], SUN_OFFSET * the_sun->direction[1], SUN_OFFSET * the_sun->direction[2]}; mat4x4_look_at(lightViewMatrix,sun_pos,player->pos,up); mat4x4_mul(lightSpaceMatrix,lightProjMatrix,lightViewMatrix); I will tweak the values for the size and frustum of the shadow map, but for now i just want to draw shadows around the player position
the_sun->direction is a normalized vector so i multiply it by a constant to get the position.
player->pos is the camera position in world space
the light projection matrix is calculated like this:
uniform mat4 light_space_matrix; void main() { gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f); } Shadow fragment shader:
out float fragDepth; void main() { fragDepth = gl_FragCoord.z; } I am using deferred rendering so i have all my world positions in the g_positions buffer