【问题标题】:Drawing a crosshair in PyOpenGL在 PyOpenGL 中绘制十字准线
【发布时间】:2020-08-25 22:05:39
【问题描述】:

我在 OpenGL 的 3D 场景中有一个工作相机,我决定在中间画一个十字准线。为此,我想为十字准线(以及最终的 HUD)和 3D 场景使用单独的着色器。我设法使用glDrawArrays 和一个带有线顶点的 VBO 来完成工作。

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

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

#version 450 core

layout (location = 0) in vec2 aPos;

void main() {
    gl_Position = vec4(aPos, 0, 0);
}
#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.

这是我的窗口的样子:

提前致谢!

【问题讨论】:

  • 如果您需要,这里是完整的代码,使用与帖子中相同的 GUI 顶点和片段着色器:pastebin.com/x4ya81tj

标签: python opengl glsl shader pyopengl


【解决方案1】:

问题在于顶点着色器中Homogeneous 剪辑空间坐标的计算。通过将gl_Position.xyz 分量除以它的.w 分量(Perspective divide) 来计算归一化的设备空间坐标。
由于.w 分量为0,因此生成的坐标变为无限(除了坐标本身为0)。

gl_Position = vec4(aPos, 0, 0);

gl_Position = vec4(aPos, 0, 1.0);

【讨论】:

猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2014-05-15
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多