Python 在PyOpenGL中绘制十字线 我在OpenGL的3D场景中有一台工作摄像机,我决定在中间画十字准线。要做到这一点,我想为十字线(最终是HUD)和3D场景使用单独的着色器。我使用glDrawArrays和一个带有线条顶点的VBO,成功地完成了一些工作

Python 在PyOpenGL中绘制十字线 我在OpenGL的3D场景中有一台工作摄像机,我决定在中间画十字准线。要做到这一点,我想为十字线(最终是HUD)和3D场景使用单独的着色器。我使用glDrawArrays和一个带有线条顶点的VBO,成功地完成了一些工作,python,opengl,glsl,shader,pyopengl,Python,Opengl,Glsl,Shader,Pyopengl,这个设置的问题是十字线一直延伸到窗口的边界,即使我指定了小的坐标,使它正好位于屏幕的中心 以下是我的着色器(依次为顶点着色器和片段着色器): 正如你所看到的,它们非常简单,对坐标没有任何作用。绘图过程如下所示: crosshair = np.array([ -0.02, 0, 0.02, 0, 0, -0.02, 0, 0.02], dtype = 'float32') vbo_2d, vao_2d = glGenBuffers(1), glGenVertexArrays

这个设置的问题是十字线一直延伸到窗口的边界,即使我指定了小的坐标,使它正好位于屏幕的中心

以下是我的着色器(依次为顶点着色器和片段着色器):

正如你所看到的,它们非常简单,对坐标没有任何作用。绘图过程如下所示:

crosshair = np.array([
  -0.02, 0,
   0.02, 0,
   0, -0.02,
   0,  0.02], dtype = 'float32')
vbo_2d, vao_2d = glGenBuffers(1), glGenVertexArrays(1)

glBindVertexArray(vao_2d)
glBindBuffer(GL_ARRAY_BUFFER, vbo_2d)
glBufferData(GL_ARRAY_BUFFER, crosshair, GL_STATIC_DRAW)

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, ctypes.c_void_p(0))
glEnableVertexAttribArray(0)

while not window.check_if_closed():
    #render 3d stuff with another shader program and other vbos ad vaos

    glBindVertexArray(0)

    shader_program_2d.use()
    glBindVertexArray(vao_2d)
    glDrawArrays(GL_LINES, 0, 4)

    #swap buffers etc.
这就是我的窗口的外观:


提前谢谢

问题是顶点着色器中剪辑空间坐标的计算。通过将
gl\u位置的
.xyz
组件除以其
.w
组件()。
由于
.w
组件为0,因此生成的坐标将变为无穷大(坐标本身为0除外)

gl_位置=vec4(aPos,0,0)

gl_位置=vec4(aPos,0,1.0);

问题在于顶点着色器中剪辑空间坐标的计算。通过将
gl\u位置的
.xyz
组件除以其
.w
组件()。
由于
.w
组件为0,因此生成的坐标将变为无穷大(坐标本身为0除外)

gl_位置=vec4(aPos,0,0)

gl_位置=vec4(aPos,0,1.0);

这是完整的代码,如果您需要的话,它与文章中的GUI顶点和片段着色器相同:这是完整的代码,如果您需要的话,它与文章中的GUI顶点和片段着色器相同:嗯,非常有趣,它没有给出某种形式的数学错误。。。我被0除了!谢谢@Parashoo是否要为处理的每个顶点获取运行时错误?GLSL可能支持特殊值-Inf,Inf。请看,很有趣,它没有给出某种形式的数学错误。。。我被0除了!谢谢@Parashoo是否要为处理的每个顶点获取运行时错误?GLSL可能支持特殊值-Inf,Inf。请参阅
#version 450 core

out vec4 FragColor;

void main() {
    FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
crosshair = np.array([
  -0.02, 0,
   0.02, 0,
   0, -0.02,
   0,  0.02], dtype = 'float32')
vbo_2d, vao_2d = glGenBuffers(1), glGenVertexArrays(1)

glBindVertexArray(vao_2d)
glBindBuffer(GL_ARRAY_BUFFER, vbo_2d)
glBufferData(GL_ARRAY_BUFFER, crosshair, GL_STATIC_DRAW)

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, ctypes.c_void_p(0))
glEnableVertexAttribArray(0)

while not window.check_if_closed():
    #render 3d stuff with another shader program and other vbos ad vaos

    glBindVertexArray(0)

    shader_program_2d.use()
    glBindVertexArray(vao_2d)
    glDrawArrays(GL_LINES, 0, 4)

    #swap buffers etc.