Opengl 如何制作单图像skybox?
我已经让skybox开始工作了,只是它可以接收六个文件。我想了解如何使用1个文件而不是6个文件。我在互联网上找遍了,找不到任何有用的东西。以下是loadCubeMap函数,用于将图像放入cubemap:Opengl 如何制作单图像skybox?,opengl,skybox,Opengl,Skybox,我已经让skybox开始工作了,只是它可以接收六个文件。我想了解如何使用1个文件而不是6个文件。我在互联网上找遍了,找不到任何有用的东西。以下是loadCubeMap函数,用于将图像放入cubemap: public int loadCubeMap(String[] textureFiles){ int texID = GL11.glGenTextures(); GL13.glActiveTexture(GL13.GL_TEXTURE0); GL11.glBindText
public int loadCubeMap(String[] textureFiles){
int texID = GL11.glGenTextures();
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, texID);
for(int i=0;i<textureFiles.length;i++){
TextureData data = decodeTextureFile("res/" + textureFiles[i] + ".png");
GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL11.GL_RGBA, data.getWidth(), data.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, data.getBuffer());
}
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
textures.add(texID);
return texID;
}
public int loadCubeMap(字符串[]纹理文件){
int texID=GL11.glGenTextures();
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL13.GL_纹理_立方体_贴图,texID);
对于(int i=0;i,您可以按任何方式将skybox的6个边组合成一个纹理。您只需将skybox每边的纹理坐标设置为图像的相应部分。如果您将skybox图像设置为一行中的TopBottomLeftRightFrontBack(6:1纵横比)然后,只需将顶面设置为
{0.0,0.0}{0.1666,0.0}{0.1666,1.0}{0.0,1.0}
还有你的下半身
{0.1666,0.0}{0.3332,0.0}{0.3332,1.0}{0.1666,1.0}
其他面也是如此。什么图像?你知道布局吗?是关于如何从纹理数据中提取图像部分的问题。
?请更具体。@keltar从代码中我看到他当前的立方体贴图是6张png图像。我相信他想要一张file@ratchetfreak我明白,但它可能意味着不同的瘦压缩6个PNG是一个文件;使用多曲面文件格式是一个文件;将所有图像合并到单个2D也是一个文件。如果使用最后一个选项,图像可能包含不同的布局(将所有6个设置为一行或其他任何内容),加载器必须意识到这一点。抱歉,我的问题没有具体说明,图像格式如下:使用明确指定的布局,您可以为每个立方体贴图边计算矩形,例如,第一边是开的(0,h/3,w/4,h/3*2)。然后您需要为较小的图像分配内存缓冲区(立方体贴图的一侧),将纹理数据中的像素复制到其中(逐行),并将生成的缓冲区传递到glTexImage2D
。重复所有6个方面。我对java的经验不存在,但对任何语言都是一样的。顺便说一句,给定的布局不是很好-几乎一半的像素是未使用的空间,这需要内存和解码时间(但仅在加载期间)。