Problem with TBO

Started by
1 comment, last by smile55 11 years, 10 months ago
I was trying to use TBO to do a simple task: First I fill a buffer object with some data; Then I want to visualize the result, so I bind the buffer object to TEXTURE_BUFFER, and post it on the screen.

here is my codes:

Initialize:


/* Just fill the buffer, color is changing in x direction */
std::vector<float> damp(WIN_WIDTH * (WIN_HEIGHT + 1));
for (int i = 0; i < WIN_WIDTH; ++i) {
for (int j = 0; j < WIN_HEIGHT; ++j) {
damp[i + j * WIN_WIDTH] = (float)i / WIN_WIDTH;
}
}

/* Create the TBO and fill the TBO with the data generated above */
glGenBuffers(1, &g_buf_levelset);
glBindBuffer(GL_TEXTURE_BUFFER, g_buf_levelset);
glBufferData(GL_TEXTURE_BUFFER, width * height * sizeof(float), &damp[0], GL_DYNAMIC_COPY);
glBindBuffer(GL_TEXTURE_BUFFER, 0);

/* Create the texture of the TBO */
glGenTextures(1, &g_tex_levelset);
glBindTexture(GL_TEXTURE_BUFFER, g_tex_levelset);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, g_buf_levelset);
glBindTexture(GL_TEXTURE_BUFFER, 0);


Rendering:


/* Post the texture to the screen */
glUseProgram(g_pgm_texture);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_BUFFER, g_tex_levelset);

glUniform1i(g_uniform_texture, 0);
glUniform1i(g_uniform_win_width, WIN_WIDTH);
glUniform1i(g_uniform_win_height, WIN_HEIGHT);

glBindVertexArray(g_quad_vao);
glEnableVertexAttribArray(0);

glDrawArrays(GL_QUADS, 0, 4);

glDisableVertexAttribArray(0);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_BUFFER, 0);
glUseProgram(0);


Here is the fragment shader:

#version 330
uniform samplerBuffer tex;
uniform int win_width;
uniform int win_height;
out vec4 color;
void main(void)
{
int offset = int(gl_FragCoord.x + gl_FragCoord.y * win_width);
float dist = texelFetch(tex, offset).r;

color = vec4(dist, 0.0, 0.0, 1.0);
}


There is no vertex shader , the verts are just the four corners of a screen quad. I mean they are {(-1.0, -1.0, 0.0), (1.0, -1.0, 0.0), (1.0, 1.0, 0.0), (-1.0, 1.0, 0.0)}, I set the modelview matrix and projection matrix both to identity matrices.

But the image I got was shifted: the left half part of the image was move to right half of the screen, and the right half of the image was round to left half of the screen.

I mean, the distribution of color in x direction is supposed to be:
[0.0 --------------------> 1.0]
but I got:
[0.5----->1.0 0.0 --- >0.5]

If I change the code from

glBufferData(GL_TEXTURE_BUFFER, width * height * sizeof(float), &damp[0], GL_DYNAMIC_COPY);

to

glBufferData(GL_TEXTURE_BUFFER, width * height * sizeof(float), &damp[WIN_WIDTH / 2], GL_DYNAMIC_COPY);


The result is correct. So it seems the while data is offset by WIN_WIDTH / 2.

I checked the codes for a lot times and can't figure out why, anyone has some ideas?

Thanks in advance.
Advertisement
Is it true that width == WIN_WIDTH and height == WIN_HEIGHT? Why do you allocate the damp vector of WIN_WIDTH * (WIN_HEIGHT + 1) elements, instead of WIN_WIDTH * WIN_HEIGHT?

Is it true that width == WIN_WIDTH and height == WIN_HEIGHT? Why do you allocate the damp vector of WIN_WIDTH * (WIN_HEIGHT + 1) elements, instead of WIN_WIDTH * WIN_HEIGHT?


It's true that width == WIN_WIDTH and height == WIN_HEIGHT.

I use WIN_WIDTH * (WIN_HEIGHT + 1) because I manually offset WIN_WIDTH / 2 to bypass the problem: I copy data between damp[WIN_WIDTH / 2 : WIN_WIDTH * WIN_HEIGHT + WIN_WIDTH / 2] to TBO instead of damp[0 : WIN_WIDTH * HEIGHT].

It solve the problem, but I want to know what causes the problem.

This topic is closed to new replies.

Advertisement