Opengl glBindTexture使用最后一个纹理加载

时间:2016-01-18 15:14:18

标签: c++ opengl soil

opengl只使用最后加载的纹理,我不知道为什么。这是我的代码:

GLuint loadTex(const char* c) {
GLuint temp = SOIL_load_OGL_texture(
    c,
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

if (0 == temp)
{
    printf("SOIL loading error: '%s'\n", SOIL_last_result());
    //return 0;
}

//glGenTextures(1, &temp);

glBindTexture(GL_TEXTURE_2D, temp);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return temp;

}

void drawObject(std::vector<Level::Triangle> faces, GLuint &resID, double x, double y, double z ){
glColor3f(1, 1, 1);

//glColor3f(0, 1, 0);

glTranslatef(x, y, z);

glBegin(GL_TRIANGLES);
//glBindTexture(GL_TEXTURE_2D, resID);
//glActiveTexture(GL_TEXTURE1);
for (int i = 0; i < faces.size(); i++){
    Level::Triangle t = faces[i];

    glTexCoord2f(t.p1.tx, t.p1.ty);

    //glTexCoord2f(0.0, 0.0);

    glVertex3f(t.p1.x, t.p1.y, t.p1.z);

    glTexCoord2f(t.p2.tx, t.p2.ty);

    //glTexCoord2f(0.0, 1.0);

    glVertex3f(t.p2.x, t.p2.y, t.p2.z);

    glTexCoord2f(t.p3.tx, t.p3.ty);

    //glTexCoord2f(1.0, 1.0);

    glVertex3f(t.p3.x, t.p3.y, t.p3.z);
}
glEnd();

glTranslatef(-x, -y, -z);

}

将纹理加载到c ++向量类数组中,然后传递给drawObject函数。在绘制对象时只使用最后加载的纹理,我不知道为什么。是的,每次SOIL加载纹理时,都会为其分配一个新的GLuint,是的,纹理在使用前加载。

1 个答案:

答案 0 :(得分:3)

glBegin(GL_TRIANGLES);
//glBindTexture(GL_TEXTURE_2D, resID);
//glActiveTexture(GL_TEXTURE1);

您可以在glBeginglEnd之间调用的唯一功能是顶点提交调用,例如glColor*glTexCoord*glVertex*以及其他一些功能。在 glBindTexture之前,glActiveTextureglBegin必须被称为

此外,您的订单glActiveTextureglBindTexture不正确;您需要先使用glActiveTexture选择要绑定到的纹理,然后将其与glBindTexture实际绑定。

(我还建议你不要使用glBegin和朋友;学会使用顶点缓冲对象,顶点数组对象和着色器,因为glBegin,et.al。已被弃用,不要缩放)