2017-06-06 10 views
-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が発生しておらず、シェーダにはコンパイルエラーがありません(審美的な目的でエラーチェックコードは省略されています)。

答えて

0

解決策はシンプルで、動的タイピングのために見逃しやすいです。ここ

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)) 
をお読みください
関連する問題