-1
トランスフォームのフィードバックのためのチュートリアルですが、Pythonの中ではおおよそthisです。簡単な変換フィードバック頂点シェーダ、シンプルなPython + OpenGLトランスフォームのフィードバック
#version 400 core
in float inValue;
out float outValue;
void main()
{
outValue = 5*inValue+6;
}
とそれを呼び出すために、周囲のPythonコード、私は出力[6. 6. 6. -4. -5.]
を得る
...
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
考えます。したがって、inValue
は常に0であるように見えます。しかし、GL_ARRAY_BUFFERを読み返すと、入力データが得られます。バッファを頂点配列に正しく結合していませんか?どの時点でもglError
が発生しておらず、シェーダにはコンパイルエラーがありません(審美的な目的でエラーチェックコードは省略されています)。