Thread: [PyOpenGL-Users] Question on glBufferData / glBufferSubData
Brought to you by:
mcfletch
From: Walter W. <hom...@gm...> - 2014-03-15 23:48:30
|
Hello, I have a question about PyOpenGL and hope that you can help me. I am a little bit confused about the follwing. This works fine: glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(npData), ADT.voidDataPointer(npData), GL_STATIC_DRAW) This also works fine: glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), npData) But using this results in OpenGL Error 1281 Invalid Type after a few seconds: glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), ADT.voidDataPointer(npData)) I don't understand why using ADT.voidDataPointer(npData) in the latter does not work as the specification states the that the type is a void pointer to the data array in both functions: void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); Kind regards, Walter |
From: Walter W. <hom...@gm...> - 2014-03-24 09:23:33
|
Hello, I have a question about PyOpenGL and hope that you can help me. While working through the arcsynthesis opengl tutorial I came across the following issue. The example This works fine: Hello, I have a question about PyOpenGL and hope that you can help me. While working through the arcsynthesis opengl tutorial I came across a problem using glBufferSubData. My code is here: http://bpaste.net/show/FAhw0W1Hx4WDW9toa75H/ This works fine: glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(npData), ADT.voidDataPointer(npData), GL_STATIC_DRAW) But using glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), npData) or (I guess identical) glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), ADT.voidDataPointer(npData)) results in an OpenGL Error 1281 Invalid Type after a few seconds. During the first 1 - 5 seconds the program works as expected. Can someone tell me what causes the problem? Kind regards, Walter |
From: Mike C. F. <mcf...@vr...> - 2014-03-24 14:43:55
|
On 03/24/2014 05:23 AM, Walter White wrote: ... > Hello, > > I have a question about PyOpenGL and hope that you can help me. > > While working through the arcsynthesis opengl tutorial I came > across a problem using glBufferSubData. > > My code is here: > > http://bpaste.net/show/FAhw0W1Hx4WDW9toa75H/ > > This works fine: > > glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(npData), > ADT.voidDataPointer(npData), GL_STATIC_DRAW) > > But using > > glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), npData) > > or (I guess identical) > > glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), > ADT.voidDataPointer(npData)) > > results in an OpenGL Error 1281 Invalid Type after a few > seconds. During the first 1 - 5 seconds the program works as expected. Your code in the bpaste there works fine on my Kubuntu 13.10 machine, so I'm assuming you mean you replace the existing glBufferData call with a glBufferSubData call. I'm surprised it works for the first few seconds with that substitution. If I replace the initial call to glBufferData with a glBufferSubData call you should (and my tests show that I do) get an INVALID_VALUE error, because the buffer to which we are attempting to write currently has 0 size (the docs for glBufferSubData describe this condition as well, where offset + size goes beyond the end of the reserved space for the buffer). The first call to glBufferData creates the buffer *and sets its size*, only once that is done can you start writing with glBufferSubData. Hope that helps, Mike -- ________________________________________________ Mike C. Fletcher Designer, VR Plumber, Coder http://www.vrplumber.com http://blog.vrplumber.com |
From: Walter W. <hom...@gm...> - 2014-03-25 16:54:27
|
Hello Mike, still no success on the issue. I tried two different machines, identical set-up, Win7,64-bit,Python 3.3, same problem. This is the complete error message, maybe you can take a look: http://bpaste.net/show/2KUuv5TCRPrYbI1OkCa5/ I guess the following calls are identical, right? glBufferSubData(...,...,..., ADT.voidDataPointer(tmpArray)) glBufferSubData(...,...,..., tmpArray) Kind regards, Walter |
From: Mike C. F. <mcf...@vr...> - 2014-03-26 02:38:31
|
On 03/25/2014 12:54 PM, Walter White wrote: > Hello Mike, > > still no success on the issue. > I tried two different machines, identical set-up, Win7,64-bit,Python 3.3, > same problem. > > This is the complete error message, maybe you can take a look: > > http://bpaste.net/show/2KUuv5TCRPrYbI1OkCa5/ > > I guess the following calls are identical, right? > > glBufferSubData(...,...,..., ADT.voidDataPointer(tmpArray)) > glBufferSubData(...,...,..., tmpArray) Yes, voidDataPointer is automatically called, no reason to do the call yourself. I see that vispy has encountered the *same* error you are seeing on some particular machine: https://github.com/vispy/vispy/issues/64 The commit linked there suggests that this is a bug in specific ATI drivers. Almar worked around it by redoing the call with glBufferData IFF the values happen to cover the whole buffer. I am *not* seeing the bug on AMD Linux, as noted, but possibly some AMD Windows driver has it? I have to say I'm pretty surprised to see something as basic as glBufferSubData have an error like this... this is pretty basic/core functionality to have it not work. Precise hardware/driver information is likely relevant here, the fact that the two machines failing are identical lends credence to the driver/hardware issue, I suppose. Thanks, Mike -- ________________________________________________ Mike C. Fletcher Designer, VR Plumber, Coder http://www.vrplumber.com http://blog.vrplumber.com |
From: Walter W. <hom...@gm...> - 2014-03-16 00:11:12
|
Hello, sorry, I guess I wrote to quickly. Both methods using glBufferSubData work as expected for a few seconds but then stop working with OpenGL.error.GLError: GLError( err = 1281, description = b'invalid value', baseOperation = glBufferSubData, I found a this bug report https://bugs.launchpad.net/pygl3display/+bug/1178470 but I am not sure if this is related. I am using Windows 7 with PyOpenGL-3.1.0b1.win-amd64-py3.3 PyOpenGL-accelerate-3.1.0b1.win-amd64-py3.3 Kind regards, Walter Am 16.03.2014 00:48, schrieb Walter White: > Hello, > > I have a question about PyOpenGL and hope that you can help me. > > I am a little bit confused about the follwing. > > This works fine: > > glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(npData), > ADT.voidDataPointer(npData), GL_STATIC_DRAW) > > This also works fine: > > glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), npData) > > But using this results in OpenGL Error 1281 Invalid Type after a few > seconds: > > glBufferSubData(GL_ARRAY_BUFFER, 0, ADT.arrayByteCount(npData), > ADT.voidDataPointer(npData)) > > I don't understand why using ADT.voidDataPointer(npData) in the > latter does not work as the specification states the that > the type is a void pointer to the data array in both functions: > > void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, > const GLvoid * data); > > void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, > GLenum usage); > > Kind regards, > Walter > |