裁剪用着色渲染的VBO

2024-09-29 18:47:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PyOpenGL开发一个2D游戏引擎。你知道吗

为了与以前版本的使用SDL的引擎保持一致,图形元素首先存储在VBO中,其中(0,0)是左上角,(640448)是右下角(因此y轴反转)。我们称之为SDL坐标。你知道吗

因为我的图形使用调色板效果,所以我使用着色器渲染它们。我的顶点着色器只是将2D坐标系转换为[-1;1]立方体。你知道吗

现在,我需要剪辑显示器。我的第一个想法是通过像素着色器来实现,将剪裁区域外的所有顶点发送到[-1;1]立方体外的一个点(我取了(2.0,0.0,0.0,1.0)),但它出错了:它使方形瓷砖变形,这些瓷砖的一些边在剪裁区域外,但不是全部。你知道吗

所以我考虑使用glFrustum,但是我不知道我必须在哪个坐标系中指定参数。你知道吗

事实上,在运行代码时,我尝试或多或少地将任何内容作为参数,而没有注意到任何内容。我做错什么了?你知道吗

目前,我的作画程序是这样的:

def draw(self):
    glClearColor(1.0, 1.0, 0.0, 1.0)
    glClear(GL_COLOR_BUFFER_BIT)

    glEnable( GL_TEXTURE_2D )
    glActiveTexture( GL_TEXTURE0 )
    glBindTexture( GL_TEXTURE_2D, self.v_texture)

    glEnable( GL_TEXTURE_1D )
    glActiveTexture( GL_TEXTURE1 )

    shaders.glUseProgram(self.shaders_program)
    shaders.glUniform1i(self.texture_uniform_loc, 0)
    shaders.glUniform1i(self.palette_uniform_loc, 1)
    shaders.glUniform2f(self.offset_uniform_loc, 0, 0)
    shaders.glUniform4f(self.color_uniform_loc, 1, 1, 1, 1)

    # Draw layers
    for layer in self.layers: #[0:1]:
        layer.draw()

    shaders.glUseProgram( 0 )
    pygame.display.flip()

类内层:

def draw(self):
    glFrustum(0.0, 0.5, 0.0, 0.5, 0.1, 1.0) # I tried anything here...

    # offset is an offset to add to coordinates (in SDL_coordinates)
    shaders.glUniform2f(self.vdp.offset_uniform_loc, self.x, self.y)
    # color is likely irrelevant here 
    shaders.glUniform4f(self.vdp.color_uniform_loc, *self.color_modifier)

    glBindTexture( GL_TEXTURE_1D, self.palette.get_id())

    self.vbo.bind()

    glEnableClientState(GL_VERTEX_ARRAY)
    glEnableClientState(GL_TEXTURE_COORD_ARRAY)
    glVertexPointer(3, GL_FLOAT, 20, self.vbo)
    glTexCoordPointer(2, GL_FLOAT, 20, self.vbo + 12)
    glDrawArrays(GL_QUADS, 0, len(self.vbo))

    self.vbo.unbind()
    glDisableClientState(GL_TEXTURE_COORD_ARRAY)
    glDisableClientState(GL_VERTEX_ARRAY)

注意:我必须说我是OpenGL的新手。我是通过阅读教程学习的,对“旧的”和“新的”OpenGL很困惑。你知道吗

我觉得截头体更像是“老”的OpenGL,就像许多转换矩阵操作一样(大多数都可以由顶点着色器处理)。我可能在这方面完全错了,glFrustum(或其他东西)在我的情况下可能是不可避免的。我想读一篇关于“旧”OpenGL中可以完全遗忘的东西的文章。你知道吗


Tags: selfuniformarraylocoffsetcoloropenglsdl
1条回答
网友
1楼 · 发布于 2024-09-29 18:47:46

除非在着色器中使用内置矩阵(gl_ModelViewProjectionMatrix等),否则glFrustum不会做任何事情。如果您不使用这些矩阵,请不要现在就开始使用它们(这是“旧”OpenGL的一部分,这是正确的)。你知道吗

听起来您想使用^{},它在窗口坐标中定义了一个剪切矩形(注意,这些矩形的原点在窗口的左下角)。必须使用glEnable(GL_SCISSOR_TEST)启用它。你知道吗

至于那些关于“旧的”OpenGL完全可以忘记的东西的文章:google的“现代OpenGL”或“OpenGL弃用”应该给你一些出发点。你知道吗

相关问题 更多 >

    热门问题