我正在用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中可以完全遗忘的东西的文章。你知道吗
除非在着色器中使用内置矩阵(
gl_ModelViewProjectionMatrix
等),否则glFrustum
不会做任何事情。如果您不使用这些矩阵,请不要现在就开始使用它们(这是“旧”OpenGL的一部分,这是正确的)。你知道吗听起来您想使用^{} ,它在窗口坐标中定义了一个剪切矩形(注意,这些矩形的原点在窗口的左下角)。必须使用
glEnable(GL_SCISSOR_TEST)
启用它。你知道吗至于那些关于“旧的”OpenGL完全可以忘记的东西的文章:google的“现代OpenGL”或“OpenGL弃用”应该给你一些出发点。你知道吗
相关问题 更多 >
编程相关推荐