简单的Python+OpenGL变换反馈

csbfibhn  于 2022-09-26  发布在  Python
关注(0)|答案(3)|浏览(169)

紧跟this教程以获取变换反馈,但使用的是python。给定一个简单的变换反馈顶点着色器,


# version 400 core

in float inValue;
out float outValue;

void main()
{
  outValue = 5*inValue+6;
}

和周围的Python代码来调用它,

...

varyings = ctypes.create_string_buffer('outValue')
varyings_pp = POINTER(POINTER(c_char))(ctypes.cast(varyings, POINTER(c_char)))
gl.glTransformFeedbackVaryings(program, 1, varyings_pp, gl.GL_INTERLEAVED_ATTRIBS);

gl.glLinkProgram(program)
gl.glUseProgram(program)

vao = gl.glGenVertexArrays(1)
gl.glBindVertexArray(vao)

data = np.array([1.,2.,3.,4.,5.], dtype=np.float32)
vbo = gl.glGenBuffers(1)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vbo)
gl.glBufferData(gl.GL_ARRAY_BUFFER, data.nbytes, data, gl.GL_STATIC_DRAW)

inputAttrib = gl.glGetAttribLocation(program, "inValue")
gl.glEnableVertexAttribArray(inputAttrib)
gl.glVertexAttribPointer(inputAttrib, 1, gl.GL_FLOAT, gl.GL_FALSE, 0, 0)

data = np.array([-1.,-2.,-3.,-4.,-5.], dtype=np.float32)
tbo = gl.glGenBuffers(1)
gl.glBindBuffer(gl.GL_TRANSFORM_FEEDBACK_BUFFER, tbo)
gl.glBufferData(gl.GL_TRANSFORM_FEEDBACK_BUFFER, data.nbytes, data, gl.GL_STATIC_READ)

gl.glEnable(gl.GL_RASTERIZER_DISCARD)

gl.glBindBufferBase(gl.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo)

gl.glBeginTransformFeedback(gl.GL_POINTS)
gl.glDrawArrays(gl.GL_POINTS, 0, 3)
gl.glEndTransformFeedback()

gl.glFlush()

r_data = np.empty_like(data)
gl.glGetBufferSubData(gl.GL_TRANSFORM_FEEDBACK_BUFFER, 0, data.nbytes, r_data)
print r_data

我得到了输出[6. 6. 6. -4. -5.]。因此,inValue似乎始终为0。然而,如果我读回GL_ARRAY_BUFFER,我会得到我的输入数据。我是否错误地将缓冲区绑定到顶点数组?在任何点上都不会引发任何e1d2d1,并且着色器没有编译错误(出于美学目的,省略了错误检查代码)。

p8h8hvxi

p8h8hvxi1#

同样的问题也发生在我身上。我不是OpenGL方面的Maven,但我认为问题出在从c类型缓冲区指针到值的类型转换中。经过几次尝试和尝试,我终于找到了解决方案。就转换而言,glMapBuffer似乎不是glGetBufferSubData函数,而是准确的。

可以实现以下几行代码来获取这些值。

bf = glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_WRITE)
pointer = ctypes.cast(bf, ctypes.POINTER(ctypes.c_float))
arrayFromPointer = numpy.ctypeslib.as_array(pointer, (5,))

for ele in arrayFromPointer:
    print(ele)

glUnmapBuffer(GL_ARRAY_BUFFER)

另外,我发现这个article非常有用。

dzhpxtsq

dzhpxtsq2#

解决方案很简单,而且由于动态键入,很容易遗漏。这条线在这里

gl.glVertexAttribPointer(inputAttrib, 1, gl.GL_FLOAT, gl.GL_FALSE, 0, 0)

应阅读

gl.glVertexAttribPointer(inputAttrib, 1, gl.GL_FLOAT, gl.GL_FALSE, 0, ctypes.c_void_p(0))
cedebl8k

cedebl8k3#

请使用以下代码。

r_data = (c_float * data.size)()
gl.glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, data.nbytes, byref(r_data))
r_data = np.frombuffer(r_data, dtype=np.float32)
print(r_data)

相关问题