python绘制简笔小行星_使用间接绘制的小行星程序,glMultiDrawArraysIndirect不渲染并绘制空白...

#!/usr/bin/python3importsysimporttimeimportctypes

fullscreen=Truesys.path.append("./shared")fromsbmloaderimportSBMObject# location of sbm file format loaderfromsbmathimportm3dDegToRad,m3dRadToDeg,m3dTranslateMatrix44,m3dRotationMatrix44,m3dMultiply,m3dOrtho,m3dPerspective,rotation_matrix,translate,m3dScaleMatrix44,\

scale,m3dLookAt,normalizetry:fromOpenGL.GLUTimport*fromOpenGL.GLimport*fromOpenGL.GLUimport*fromOpenGL.raw.GL.ARB.vertex_array_objectimportglGenVertexArrays,glBindVertexArrayexcept:print('''

ERROR: PyOpenGL not installed properly.

''')sys.exit()fromarrayimportarrayfromenumimportEnumimportnumpyasnpfrommathimportcos,sin

identityMatrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]render_program=GLuint(0)myobject=SBMObject()indirect_draw_buffer=GLuint(0)draw_index_buffer=GLuint(0)classuniforms():time=GLint(0)view_matrix=GLint(0)proj_matrix=GLint(0)viewproj_matrix=GLint(0)uniform=uniforms()mode=1MODE_MULTIDRAW=1MODE_SEPARATE_DRAWS=2paused=Falsevsync=FalseNUM_DRAWS=50000classDrawArraysIndirectCommand:count=GLuint(0)primCount=GLuint(0)first=GLuint(0)baseInstance=GLuint(0)defshader_load(filename,shader_type):result=GLuint(0)withopen(filename,"rb")asdata:result=glCreateShader(shader_type)glShaderSource(result,data.read())glCompileShader(result)returnresultdeflink_from_shaders(shaders,shader_count,delete_shaders,check_errors=False):program=GLuint(0)program=glCreateProgram()foriinrange(0,shader_count):glAttachShader(program,shaders[i]);glLinkProgram(program);if(delete_shaders):foriinrange(0,shader_count):glDeleteShader(shaders[i]);returnprogramdefload_shaders():globalrender_programglobaluniform

shaders=[GLuint(0),GLuint(0)]shaders[0]=shader_load("render.vs.glsl",GL_VERTEX_SHADER)shaders[1]=shader_load("render.fs.glsl",GL_FRAGMENT_SHADER)if(render_program):glDeleteProgram(render_program)render_program=link_from_shaders(shaders,2,True)uniform.time=glGetUniformLocation(render_program,"time")uniform.view_matrix=glGetUniformLocation(render_program,"view_matrix")uniform.proj_matrix=glGetUniformLocation(render_program,"proj_matrix")uniform.viewproj_matrix=glGetUniformLocation(render_program,"viewproj_matrix")classScene:def__init__(self,width,height):globalmyobjectglobalindirect_draw_bufferglobaldraw_index_buffer

i=0load_shaders()myobject.load("asteroids.sbm")sizeOfDrawIndCmd=ctypes.sizeof(GLuint*4)glGenBuffers(1,indirect_draw_buffer)glBindBuffer(GL_DRAW_INDIRECT_BUFFER,indirect_draw_buffer)glBufferData(GL_DRAW_INDIRECT_BUFFER,NUM_DRAWS*sizeOfDrawIndCmd,None,GL_STATIC_DRAW)cmd_memory=glMapBufferRange(GL_DRAW_INDIRECT_BUFFER,0,NUM_DRAWS*sizeOfDrawIndCmd,GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_BUFFER_BIT)cmd_buffer=((GLuint*4)*NUM_DRAWS).from_address(cmd_memory)foriinrange(0,NUM_DRAWS):first,count=myobject.get_sub_object_info(i%myobject.get_sub_object_count())cmd_buffer[i][0]=count

cmd_buffer[i][1]=1cmd_buffer[i][2]=first

cmd_buffer[i][3]=i

glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER)glBindVertexArray(myobject.get_vao())glGenBuffers(1,draw_index_buffer)glBindBuffer(GL_ARRAY_BUFFER,draw_index_buffer)glBufferData(GL_ARRAY_BUFFER,NUM_DRAWS*ctypes.sizeof(GLuint),None,GL_STATIC_DRAW)draw_index=glMapBufferRange(GL_ARRAY_BUFFER,0,NUM_DRAWS*ctypes.sizeof(GLuint),GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_BUFFER_BIT)int_array=(GLuint*NUM_DRAWS).from_address(draw_index)foriinrange(0,NUM_DRAWS):int_array[i]=i

glUnmapBuffer(GL_ARRAY_BUFFER)glVertexAttribIPointer(10,1,GL_UNSIGNED_INT,0,None)glVertexAttribDivisor(10,1)glEnableVertexAttribArray(10)glEnable(GL_DEPTH_TEST)glDepthFunc(GL_LEQUAL)glEnable(GL_CULL_FACE)defdisplay(self):globalmyobject

currentTime=time.time()j=0one=1.0;black=[0.0,0.0,0.0,0.0]last_time=0.0;total_time=0.0;if(paused==False):total_time+=(currentTime-last_time)last_time=currentTime

t=float(total_time)i=int(total_time*3.0)glViewport(0,0,self.width,self.height)glClearBufferfv(GL_COLOR,0,black)glClearBufferfv(GL_DEPTH,0,one)view_matrix=(GLfloat*16)(*identityMatrix)view_matrix=m3dLookAt([100.0*cos(t*0.023),100.0*cos(t*0.023),300.0*sin(t*0.037)-600.0],[0.0,0.0,260.0],normalize([0.1-cos(t*0.1)*0.3,1.0,0.0]))proj_matrix=(GLfloat*16)(*identityMatrix)proj_matrix=m3dPerspective(m3dDegToRad(50.0),float(self.width)/float(self.height),1.0,2000.0)glUseProgram(render_program)glUniform1f(uniform.time,t)glUniformMatrix4fv(uniform.view_matrix,1,GL_FALSE,view_matrix)glUniformMatrix4fv(uniform.proj_matrix,1,GL_FALSE,proj_matrix)glUniformMatrix4fv(uniform.viewproj_matrix,1,GL_FALSE,m3dMultiply(proj_matrix,view_matrix))glBindVertexArray(myobject.get_vao());if(mode==MODE_MULTIDRAW):glMultiDrawArraysIndirect(GL_TRIANGLES,None,NUM_DRAWS,0);elif(mode==MODE_SEPARATE_DRAWS):forjinrange(0,NUM_DRAWS):first,count=myobject.get_sub_object_info(j%myobject.get_sub_object_count())glDrawArraysInstancedBaseInstance(GL_TRIANGLES,first,count,1,j)glutSwapBuffers()defreshape(self,width,height):self.width=width

self.height=heightdefkeyboard(self,key,x,y):globalfullscreenglobalpausedglobalmodeglobalvsyncprint('key:',key)ifkey==b'\x1b':# ESCsys.exit()elifkey==b'f'orkey==b'F':#fullscreen toggleif(fullscreen==True):glutReshapeWindow(512,512)glutPositionWindow(int((1360/2)-(512/2)),int((768/2)-(512/2)))fullscreen=Falseelse:glutFullScreen()fullscreen=Trueelifkey==b'p'orkey==b'P':#fullscreen togglepaused=notpaused# a toggle techniqueelifkey==b'v'orkey==b'V':#fullscreen togglevsync=notvsync# a toggle technique#setVsync(vsync)elifkey==b'd'orkey==b'D':#fullscreen togglemode+=1if(mode>2):mode=1print('done')definit(self):passdeftimer(self,blah):glutPostRedisplay()glutTimerFunc(int(1/60),self.timer,0)time.sleep(1/60.0)if__name__=='__main__':start=time.time()glutInit()glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)glutInitWindowSize(512,512)w1=glutCreateWindow('OpenGL SuperBible - Asteroids')glutInitWindowPosition(int((1360/2)-(512/2)),int((768/2)-(512/2)))fullscreen=Falsemany_cubes=False#glutFullScreen()scene=Scene(512,512)glutReshapeFunc(scene.reshape)glutDisplayFunc(scene.display)glutKeyboardFunc(scene.keyboard)glutIdleFunc(scene.display)#glutTimerFunc( int(1/60), scene.timer, 0)scene.init()glutMainLoop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值