0

I'm trying to draw a simple texture in opengl. I made a simple class Texture:

class Texture{
public:
    unsigned int id;
    unsigned char image[256*256*3];
    int level;
    int border;
    int width;
    int height;    

    Texture (int level =0, int border = 0) : level(level), border(border) {
        glGenTextures(1, &id);
        width = 256, height = 256;
        glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, width, height, border, GL_RGB, GL_UNSIGNED_BYTE, &image[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 


        for (int i= 0; i<width*height*3; i+=3){
            image[i]=1;//i%255;
            image[i+1] =1;// 255-i%255;
            image[i+2] =1;// i%128;
        }
    }

    void useIt(){
        glBindTexture( GL_TEXTURE_2D, id );
    }
};

It creates an unsigned char array and fill it with some random data. I'm trying to use it this way:

glEnable(GL_TEXTURE_2D);
texture->useIt();
glBegin(GL_TRIANGLES);

glNormal3d(0, 1, 0);
glTexCoord2d(0.0,0.0);
glVertex3f(width/-2.f,height/2.f,depth/2.f);
glTexCoord2d(1.0,1.0);  
glVertex3f(width/2.f,height/2.f,depth/2.f);
glTexCoord2d(1.0,0.0);
glVertex3f(width/2.f,height/2.f,depth/-2.f);
glTexCoord2d(0.0,0.0);
glVertex3f(width/-2.f,height/2.f,depth/2.f);
glTexCoord2d(1.0,1.0);
glVertex3f(width/2.f,height/2.f,depth/-2.f);
glTexCoord2d(0.0,1.0);
glVertex3f(width/-2.f,height/2.f,depth/-2.f);

glEnd();
glDisable(GL_TEXTURE_2D);

It draws the plane, but withouht texture (draws with the previously used material). what am i doing wrong?

4

2 回答 2

1

glBindTextureTexture在操作之前,在构造函数中是必需的glTex*

您可能还需要:glPixelStorei(GL_UNPACK_ALIGNMENT, 1)before glTexImage2D,因为行内存地址不在 4 字节边界上。

顺便说一句...,您需要先设置image数据,然后再通过glTexImage2D. 现在,您只是使用未初始化的数据设置纹理。此外,设置 RGB 字节数据的循环只是为您提供非常接近黑色的值,all: (1, 1, 1)

于 2012-12-01T16:22:05.063 回答
1

您的代码可能存在三个问题。Brett Hale 已经告诉过你,在使用 glTexImage 上传数据之前,你需要绑定一个纹理对象。

glTexImage 创建您提供给它的数据的副本(这与 glVertex...Pointer 函数不同,后者仅将指针或偏移量接收到缓冲区对象中)。但是,在将图像数组的内容复制到纹理之后,您正在用数据填充图像数组。您也可以在将数据复制到纹理后安全地删除图像数组。

最后但并非最不重要的一点:这些操作可以在构造函数中找到。如果在创建 OpenGL 上下文之前初始化的范围内有纹理类实例,则根本不会发生任何事情,因为没有 OpenGL 上下文。因此,要么确保仅在 OpenGL 上下文可用后创建纹理对象,要么将纹理创建和上传代码放入单独的方法中,一旦 OpenGL 上下文可用,您将调用该方法。

于 2012-12-01T16:46:48.900 回答