【问题标题】:Can someone help vertex shader error in pyopengl有人可以帮助pyopengl中的顶点着色器错误吗
【发布时间】:2021-03-03 04:20:55
【问题描述】:

我已经挑出了导致错误的代码

    self.vertex_shader_source = """
    #version 130
    in layout (location = 0) vec3 position;
    in layout (location = 1) vec3 color;
            
    out vec3 newColor;
    void main()
    {
        gl_Position = vec4(position, 1.0f);
        newColor = color;
    }
    """
    
    self.fragment_shader_source = """
    #version 130
    in vec3 newColor;
    
    out vec4 outColor;
    void main()
    {
        outColor = vec4(newColor, 1.0f);
    }
    """

错误

Traceback (most recent call last):
File "/home/awesomenoob/Coding/Python/Rendering/Opengl-tri.py", line 23, in <module>
window = MyWindow(1280, 720, "yoot", resizable=True)
File "/home/awesomenoob/Coding/Python/Rendering/Opengl-tri.py", line 10, in __init__
self.triangle = Triangle()
File "/home/awesomenoob/Coding/Python/Rendering/Triangle.py", line 35, in __init__
shader = 
OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(self.vertex_shader_source, GL_VERTEX_SHADER),
File "/home/awesomenoob/.local/lib/python3.7/site-packages/OpenGL/GL/shaders.py", line 241, in compileShader
shaderType,
OpenGL.GL.shaders.ShaderCompilationError: ('Shader compile failure (0): b"0:3(12): error: 
syntax error, unexpected \'(\', expecting \'{\'\\n"', [b'\n        #version 130\n        in 
layout (location = 0) vec3 position;\n        in layout (location = 1) vec3 color;\n                
\n        out vec3 newColor;\n        void main()\n        {\n            gl_Position = 
vec4(position, 1.0f);\n            newColor = color;\n        }\n        '], 35633)

如果你能帮助我理解我做错了什么,那将是一个巨大的帮助。我只是想在 python 中学习 pyglet/opengl

【问题讨论】:

  • 语法指南说它必须是layout (location = 0) in vec3 position;
  • @TimRoberts 没有。两者都很好,从 3.30 版本开始。

标签: python opengl glsl pyglet vertex-shader


【解决方案1】:

自 GLSL 版本 3.30 起支持顶点着色器属性位置 Layout qualifiers。比较 OpenGL Shading Language 1.30 SpecificationOpenGL Shading Language 3.30 Specification。如果可能,请使用 GLSL 3.00。

或者删除布局限定符:

#version 130
in vec3 position;
in vec3 color;
        
out vec3 newColor;
void main()
{
    gl_Position = vec4(position, 1.0f);
    newColor = color;
}

在程序链接前用glBindAttribLocation设置属性位置或在程序链接后用glGetAttribLocation获取属性位置。

例如:

shader = OpenGL.GL.shaders.compileProgram(...)
position_loc = glGetAttribLocation(shader, b'position')
color_loc = glGetAttribLocation(shader, b'color')

【讨论】:

  • 非常感谢。虽然我不需要 glBind 或 glGet。
  • @AwesomeNoob999 不,您需要glBindAttribLocationglGetAttribLocation。属性索引很可能是 0 和 1。但是,不能保证一定会。您的程序可能在您的系统上运行,但在另一个系统上可能会失败。
  • 它显示这个错误 "glGetAttribLocation(shader, "position") ctypes.ArgumentError: argument 2: : wrong type "
  • 弹出同样的错误,如果它改变了什么,我的opengl版本是3.0
  • 问题名无法获取属性位置pyglet
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2023-03-24
  • 2022-06-10
相关资源
最近更新 更多