PDA

View Full Version : BufferSubData seems to have a mind of its own!



tomb18
01-18-2017, 05:19 PM
Hi,
I've run into a problem which I cannot seem to solve.
I am plotting a 3D surface in real time. The surface starts as a plane in XZ with heights given by Y.
This plane originates as a triangle strip with indices. The result is I get a vertex array with coordinates like this (simple case of x = 3 and z = 3

vertexArray[0] = <-1, Height, +1>
vertexArray[1] = <0, Height, +1>
vertexArray[2] = <1, Height, +1>
vertexArray[3] = <-1,Height, 0>
vertexArray[4] = <0 , Height, 0>
vertexArray[5] = <1, Height, 0>
vertexArray[6] = <-1, Height, -1>
vertexArray[7] = <0, Height, -1>
vertexArray[8] = <1, Height, -1>

So you have a nice 3x3 grid and it plots fine.
Now I want to update this i real time (the actual size is 2048x100) so I update the first row starting at vertexArray[0] to vertexArray[2] and then I do a

vbo.BufferSubData(vertexArray).
So you think it would update the first row. However it updates the backrow! Even though I can check the individual elements of the vertexArray and they are correct! If I do it again to the first row, it then DOES update the first row.
I have tried three times, every time changing my algorithm and it always behaves the same!
The code is as follows, with the correct vertexArray.


Gl.UseProgram(plottingProgram);

plottingProgram["model_matrix"].SetValue(Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle));

if (dataAvailable)
{
CircularBuffer.UpdateVertexArray(); //data is updated here. 100% sure it is correct!
dataAvailable = false;
}

spectrumVBO.BufferSubData(vertexBuffer); //vertexBuffer is an array with x,y,z data. x,z is always the same

Gl.BindBufferToShaderAttribute(spectrumVBO, plottingProgram, "vertexPosition");

Gl.BindBuffer(spectrumIndicesVBO);
Gl.DrawElements(BeginMode.TriangleStrip, spectrumIndicesVBO.Count, DrawElementsType.UnsignedInt, IntPtr.Zero);


Is there something I am missing here?
Thanks

Dark Photon
01-19-2017, 05:38 AM
vbo.BufferSubData(vertexArray)

This isn't an OpenGL API call. This (https://www.opengl.org/sdk/docs/man/html/glBufferSubData.xhtml) is. Please list the code with wrapper calls like this expanded to GL calls.

tomb18
01-19-2017, 09:02 AM
This isn't an OpenGL API call. This (https://www.opengl.org/sdk/docs/man/html/glBufferSubData.xhtml) is. Please list the code with wrapper calls like this expanded to GL calls.

Hi,
Here is what I got from looking into the library...
GLSubBufferData(BufferTarget, (IntPtr)offset, (IntPtr)size, handle.AddrOfPinnedObject());
where buffer target is arraybuffer.

Tom

Dark Photon
01-19-2017, 04:33 PM
One way or the other, I suggest you get a call trace of the actual GL calls.

It's hard to tell from the wrapper APIs you've got posted what's going on. As a shot-in-the-dark, look at the values provided for the arguments of glBufferSubData.

john_connor
01-20-2017, 12:36 AM
another shot-in-the-dark, normally you can control at what offset the data should be filled in / replaced, maybe you missed something in that respect

tomb18
01-20-2017, 09:54 AM
Hi
The hints you guys gave were enough to show me that the GLSubBufferData was being passed the right parameters. So I changed my circular buffer which I was sure was 100% correct. Turns out it was only 80% correct lol.
Thanks!