我正在编写一个基本的行星查看器OpenGL Perl应用程序,只是为了好玩。
我通过gluSphere()
实现了基础工作,通过{{1}}实现了旋转,并应用了经典的地球纹理贴图。
现在,如果我想通过OpenGL应用第二个纹理贴图(比如“地球云”)怎么办?
当然,我可以在PhotoShop或其他一些图形应用程序中自己混合两个纹理贴图,但有没有办法通过OpenGL API?
我尝试加载两个纹理并生成mipmap但是行星显示时只应用了第一个纹理,而不是第二个纹理。
答案 0 :(得分:6)
您希望如何组合纹理?如果您只是使用多纹理,您应该能够获得所需的效果:
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()。
答案 1 :(得分:5)
正如Jim Buck所说,你可以通过多重纹理获得理想的效果。
但是,我不认为GLU二次曲面支持多纹理坐标生成(即使用glMultiTexCoord *()与glTexCoord *()。所以,我认为你需要自己的球体代码来进行多重纹理路径。 / p>
或者,您可以在当前具有第二个纹理贴图的周围绘制稍大的球体(适当使用Alpha通道和混合)。这可能会导致z-fighting,所以它可能比它的价值更麻烦。
编写自己的球体代码并不难 - 可能是获得满意结果的最简单途径。
答案 2 :(得分:1)
我同意Drew Hall的观点。制作第二个球体可能更简单。并非所有opengl卡都支持多纹理。
你可以使用glPolygonOffset来对抗z-fighting。