OpenGL绑定几个2D纹理

Posted

技术标签:

【中文标题】OpenGL绑定几个2D纹理【英文标题】:OpenGL binding several 2D textures 【发布时间】:2014-05-13 17:00:55 【问题描述】:

我试图将不同的纹理加载到 GL_TEXTUREX 变量中,然后将它们分配给不同的球体。但到目前为止我遇到了问题。我在帖子中尝试了一些建议,例如 this 和 this 但无法解决。

这是我的代码的一部分:

GLuint textures[2];
void LoadTextures(std::string const& dirname)

glGenTextures(2, textures);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
Image_t sun = loadPNG(std::string(dirname + "/sun.png"));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, &(sun.data[0]));  
glBindTexture(GL_TEXTURE_2D, textures[0]);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textures[1]);
Image_t mercury = loadPNG(std::string(dirname + "/mercury.png"));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1024, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(mercury.data[0]));  

void draw(void)


glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, textures[0]);
glPushMatrix();
glTranslatef(0.4,0,0);
gluSphere(sun, 0.5, 36, 36); //I want this sphere to use the texture GL_TEXTURE0
glPopMatrix();
glDisable(GL_TEXTURE_2D);

【问题讨论】:

你在使用gluQuadricTexture吗?你想达到什么结果,它与多重纹理有什么关系? 是的,我是这样使用的:gluQuadricTexture(sun, GL_TRUE);而我想要对多重纹理做的只是用不同的纹理(太阳、地球、火星等)对我的所有球体进行纹理处理。我不确定我是否走在正确的轨道上。感谢您的回复。 【参考方案1】:

您需要在执行绘图调用之前调用glBindTexture

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textures[1]);

draw_things();

在上面的示例中,无论您使用draw_things 绘制什么,都可以访问纹理 0 和 1(GL_TEXTURE0 和 GL_TEXTURE1)。

现在,如果您想要绘制很多东西,但每个都具有不同的纹理,那么您需要:

glActiveTexture(GL_TEXTURE0); // activate any texture unit
glEnable(GL_TEXTURE_2D);      // make sure texturing is enabled

glBindTexture(GL_TEXTURE_2D, thing1_texture);
draw_thing1();

glBindTexture(GL_TEXTURE_2D, thing2_texture);
draw_thing2();

// etecetera

【讨论】:

我看到了一些改进。这就是我的模型的外观:link 谢谢!现在我越来越近了。 纹理的颜色格式好像不对。我看到您在对glTexImage2D 的调用中对GL_RGB/GL_RGBA 进行了硬编码。你确定这些是正确的格式吗?此外,尺寸也是固定的。它们与图像尺寸匹配吗?理想的情况是从Image_t 对象中查询此类数据。它应该有getWidth()getFormat(),等方法。 问题出在颜色格式上。非常感谢您的宝贵时间! :D

以上是关于OpenGL绑定几个2D纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL设置纹理图片

OpenGL学习——纹理

OpenGL:如果我将新的纹理绑定到另一个目标,纹理会发生啥?

openGL之API学习(一九九)纹理单元和纹理对象的关系

关于OpenGL纹理 装载位图的问题

C++ OpenGL glTexImage2D 访问冲突