You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:13:07