PyQtGraph自定义Shader无法显示GLMeshItem问题求助
PyQtGraph自定义Shader无法显示GLMeshItem问题求助
我最近在PyQtGraph里尝试自定义Shader渲染GLMeshItem,但遇到了棘手的问题——自定义的shader完全无法显示模型,可是切换成内置的edgeHilight shader却能正常渲染。
我是参考早年论坛里的方法来添加自定义shader的,具体代码如下:
gl.shaders.Shaders.append(ShaderProgram('hilight', [ VertexShader(""" uniform mat4 u_mvp; attribute vec4 a_position; attribute vec3 a_normal; attribute vec4 a_color; varying vec4 v_color; varying vec3 normal; void main() { // compute here for use in fragment shader normal = normalize(gl_NormalMatrix * gl_Normal); v_color = a_color; gl_Position = u_mvp * a_position; } """), FragmentShader(""" #ifdef GL_ES precision mediump float; #endif varying vec4 v_color; varying vec3 normal; void main() { vec4 color = v_color; color.x = (normal.x + 1.0) * 0.5; color.y = (normal.y + 1.0) * 0.5; color.z = (normal.z + 1.0) * 0.5; gl_FragColor = color; } """) ]))
之后我在创建GLMeshItem时指定了这个自定义shader:
self.current_plot = gl.GLMeshItem( meshdata=mesh_data, shader='hilight', # Set shader here smooth=True, drawFaces=True, computeNormals=True )
但这样设置后模型根本不显示,哪怕我把自定义shader的代码完全复制内置edgeHilight的内容,结果还是一样。我确认过shader已经被正确添加到列表里了,打印self.shader.program()输出是6,说明shader的ID是存在的。
更让我困惑的是,我修改了GLMeshItem的paint函数,添加了几行调试代码来查看属性的位置:
def paint(self): self.setupGLState() self.parseMeshData() if self.opts['drawFaces']: with self.shader(): # Add debug lines print("Position: " + str(glGetAttribLocation(self.shader().program(), 'a_position'))) print("Normal: " + str(glGetAttribLocation(self.shader().program(), 'a_normal'))) print("Color: " + str(glGetAttribLocation(self.shader().program(), 'a_color'))) # Rest of code...
用自定义的hilight shader时,调试输出是:
Position: 2 Normal: 0 Color: 1
但用内置的edgeHilight时,输出却是:
Position: -1 Normal: -1 Color: -1
这完全反直觉啊,因为后者才是能正常显示模型的那个。有没有大佬能帮我分析下,这到底是哪里出问题了?
备注:内容来源于stack exchange,提问作者Fire 'N Lightnin'
相关产品推荐
相关产品推荐

