我正在编写一个基本的行星查看器 OpenGL Perl 应用程序,只是为了好玩。我有基本的工作,与光荣的星球,通过gluSphere()
应用经典地球纹理贴图的旋转实现。
现在,如果我想通过 OpenGL 应用第二个纹理贴图(比如“地球云”)怎么办?
当然,我可以自己在 PhotoShop 或其他图形应用程序中混合这两个纹理贴图,但是有没有通过 OpenGL API 的方法?
我尝试加载两个纹理并生成 mipmap,但显示的星球只应用了第一个纹理,而不是第二个。
您希望如何组合纹理?如果你简单地使用多重纹理,你应该能够得到你想要的效果:
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture0ID);
glTexEnvf(GL_TEXTURE_ENV, ..., ...);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture1ID);
glTexEnvf(GL_TEXTURE_ENV, ..., ...);
请务必根据您希望如何组合纹理来设置 glTexEnvf 调用。然后调用 gluSphere()。
正如 Jim Buck 所说,您可以通过多重纹理获得所需的效果。
但是,我认为 GLU 二次曲线不支持多纹理坐标生成(即使用 glMultiTexCoord*() 与 glTexCoord*()。所以,我认为您需要自己的球体代码来执行多纹理路线。
或者,您可能能够在当前具有第二个纹理贴图的当前球体周围绘制一个稍大的球体(适当使用 Alpha 通道和混合)。不过,这可能会导致 z-fighting,因此它可能比它的价值更麻烦。
编写自己的球体代码并不难——这可能是获得满意结果的最简单途径。
我同意德鲁霍尔的观点。制作第二个球体可能更简单。并不是所有的 opengl 卡都支持多纹理。
您可以使用 glPolygonOffset 对抗 z-fighting。