(4)glClearDepth()

glClearDepth()函数用于设置深度缓冲的初始值,影响物体在场景中的可见部分。当深度值设为1.0时,所有物体都会显示;设为0.0时,所有物体都不可见;设为0.5时,只有深度小于0.5的部分可见。配合glClear(GL_DEPTH_BUFFER_BIT)和glEnable(GL_DEPTH_TEST),可以实现深度测试,控制绘制顺序和物体遮挡效果。不开启深度测试时,OpenGL的绘制顺序与代码顺序相反。
摘要由CSDN通过智能技术生成
opengl里面的深度缓存 
在现实生活中,一个实心物体挡在另外一个实心物体的前面, 后面的那个物体有部分会被遮盖掉
那么opengl里面如何模拟这个情况呢? 每个物体的每个像素都有一个深度缓存的值(在0到1之间,可以想象成是z轴的距离)
如果glDepthFunc启用了GL_LESS(现实生活中的前景), 那么当前个物体挡住后个物体时, 由于前个物体深度值小(越靠近人的), 所以它就被画了出来, 后面的物体被挡住的像素就被忽略掉了。(当然你如果启用了GL_GREATER, 那么情况就反过来了)

这个时候再来说glClearDepth, 它给深度缓冲指定了一个初始值,缓冲中的每个像素的深度值都是这个, 比如1,这个时候你往里面画一个物体, 由于物体的每个像素的深度值都小于等于1, 所以整个物体都被显示了出来。 如果初始值指定为0, 物体的每个像素的深度值都大于等于0, 所以整个物体都不可见。 如果初始值指定为0.5, 那么物体就只有深度小于0.5的那部分才是可见的


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的OpenGL程序,用于显示一个带纹理的立方体并实现旋转: ```python import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * # 设置窗口尺寸 WINDOW_WIDTH = 800 WINDOW_HEIGHT = 600 # 定义立方体的顶点坐标 vertices = ( ( 1, -1, -1), ( 1, 1, -1), (-1, 1, -1), (-1, -1, -1), ( 1, -1, 1), ( 1, 1, 1), (-1, -1, 1), (-1, 1, 1) ) # 定义立方体的边 edges = ( (0,1), (0,3), (0,4), (2,1), (2,3), (2,7), (6,3), (6,4), (6,7), (5,1), (5,4), (5,7) ) # 定义立方体的面 surfaces = ( (0,1,2,3), (3,2,7,6), (6,7,5,4), (4,5,1,0), (1,5,7,2), (4,0,3,6) ) # 定义纹理坐标 tex_coords = ( (0, 0), (1, 0), (1, 1), (0, 1) ) # 加载纹理 def load_texture(filename): texture_surface = pygame.image.load(filename) texture_data = pygame.image.tostring(texture_surface, "RGB", 1) width = texture_surface.get_width() height = texture_surface.get_height() texture = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, texture) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_data) return texture # 绘制立方体 def draw_cube(texture): glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, texture) glBegin(GL_QUADS) for surface in surfaces: for i, vertex in enumerate(surface): glTexCoord2fv(tex_coords[i]) glVertex3fv(vertices[vertex]) glEnd() glDisable(GL_TEXTURE_2D) # 初始化OpenGL def init_opengl(): glClearColor(0.0, 0.0, 0.0, 1.0) glClearDepth(1.0) glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LEQUAL) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) # 主函数 def main(): pygame.init() display = (WINDOW_WIDTH, WINDOW_HEIGHT) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) init_opengl() texture = load_texture("texture.png") glMatrixMode(GL_PROJECTION) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0, 0.0, -5.0) clock = pygame.time.Clock() angle = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) glPushMatrix() glRotatef(angle, 1, 1, 1) draw_cube(texture) glPopMatrix() pygame.display.flip() angle += 0.5 clock.tick(60) if __name__ == "__main__": main() ``` 其中,`vertices`、`edges`、`surfaces` 和 `tex_coords` 定义了立方体的几何信息和纹理坐标,`load_texture` 函数用于加载纹理,`draw_cube` 函数用于绘制立方体,`init_opengl` 函数用于初始化 OpenGL,`main` 函数则是主函数,其中使用 Pygame 初始化窗口和 OpenGL,设置透视投影矩阵和模型视图矩阵,然后在主循环中不断旋转并绘制立方体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值