加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在OpenGL中加载纹理时颜色错误

发布时间:2020-12-16 09:40:34 所属栏目:百科 来源:网络整理
导读:我试图了解如何在OpenGL中加载纹理,我写了这个非常简单的代码: GLuint texture;void loadTexture() { GLubyte data[] = { 255,255,0 }; glGenTextures(1,texture); glBindTexture(GL_TEXTURE_2D,texture); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL
我试图了解如何在OpenGL中加载纹理,我写了这个非常简单的代码:

GLuint texture;

void loadTexture() {

    GLubyte data[] = {  255,255,0    };

    glGenTextures(1,&texture);

    glBindTexture(GL_TEXTURE_2D,texture);          

    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);   
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);   

    glTexParameterf( GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );

    int chk = gluBuild2DMipmaps( GL_TEXTURE_2D,GL_RGB,2,GL_UNSIGNED_BYTE,data );

    if (chk!=0) 
        printf("error code = %dn",chk);
    else 
        printf("successn");  

}

我使用loadTexture()在内存中加载纹理.在这个样本中,纹理非常简单,但目前无关紧要.

void drawTexturedSquare() {

    glEnable( GL_TEXTURE_2D );
    glBegin (GL_QUADS);

    glTexCoord2f (0.0,0.0);
    glNormal3f(0,1);
    glVertex3f (0.0,0.0,0.0);

    glTexCoord2f (1.0,1);
    glVertex3f (10.0,1.0);
    glNormal3f(0,1);
    glVertex3f (10,10,0.0);

    glTexCoord2f (0.0,0.0);

    glEnd ();
    glDisable( GL_TEXTURE_2D);

}

我想将这个简单的纹理应用到正方形.我从我已经调用的draw()函数内部调用函数drawTexturedSquare()

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

问题是这是我得到的结果

虽然我预计正方形在主对角线上是绿色的(左上角到右下角),红色是次要对角线(右上角到左下角).愿有人解释我为什么吗?

此外,每次运行程序时,我都会得到不同的结果:

???

我不明白这个蓝色出现在哪里……有人可以帮帮我吗?

解决方法

数据的每一行都需要4字节对齐.用0 0填充每一行,或使用RGBA纹理.

如果您不想进行上述操作,可以使用:

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

颜色变化的原因是,由于您没有正确填充行,OpenGL会读取数组的末尾.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读