绘制天空盒

来源:互联网 发布:金庸群侠传mac版 编辑:程序博客网 时间:2024/05/29 17:02

原理:
创建一个立方体,并且视点在立方体的中心。在立方体的每个面上贴上大小相同的六个立方体纹理。
这个也可以用作目前比较流行的全景图。
方法:
1.创建一个以人眼为中心的立方体。
2.创建构建这个立方体的索引。
3.创建一个立方体纹理。
4.使用立方体着色器采样这个纹理。

立方体纹理的创建:
init()

GLuint tex; glGenTextures(1, &tex);glBindTexture(GL_TEXTURE_CUBE_MAP,tex); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, filtering ? GL_LINEAR : GL_NEAREST);    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, filtering ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST);    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glPixelStorei(GL_UNPACK_ALIGNMENT, 1); for(int i=0; i<6; i++) {        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,                     GL_RGB16F, img.getWidth(), img.getHeight(), 0,                      GL_RGB, GL_HALF_FLOAT, out);    }glGenerateMipmap(GL_TEXTURE_CUBE_MAP);

draw()

glUseProgram(skyboxshaderid);//要关闭深度测试,因为天空盒作为一个背景,默认其是在无穷远的,所以没必要提供深度测试对其片元进行选择性丢弃,我们要有的效果是天空盒片元要存在不要丢弃。glDisable(GL_DEPTH_TEST);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_CUBE_MAP,cube_skyid);//因为我们是在视图空间下建立的模型立方体,所以要将其变化到世界坐标空间下。glUniformMatrix4fv(viewloc,1,GL_FALSE,inverse_view);//设置投影矩阵glBindBuffer(GL_ARRAY_BUFFER,sky_vbo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,sky_ibo);glEnableVertexAttribArray(0);glVertexAttribPointer(0,3,GL_FLOAT,false,32,0);glDrawElements(GL_TRIANLES,6*6,GL_UNSIGNED_SHORT,0);glDisableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER,0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

这里写图片描述

详细shader源码:
https://t.xiaomiquan.com/6AyZvFm

原创粉丝点击