首页 文章

SDL2与OpenGL纹理显示不正确

提问于
浏览
0

我已经搜索过这个但不幸的是我发现的唯一答案是那些处理纹理没有被映射的问题,在这种情况下纹理被映射但看起来不像加载的表面 .

无论如何,忽略了不需要2平方图像的功率这一事实(我尚未正确研究)我已经制作了一个功能脚本,用于将表面扩展到2维的功率和用于存储调整大小的结构表面,表面的旧尺寸和纹理的ID .

我的表面到纹理代码是(参数是SDL_Surface * surf,antTex * tex):

tex->w=surf->w;
tex->h=surf->h;
tex->surf=resizeToNearestPow2(surf);
glGenTextures(1, &tex->id);
glBindTexture(GL_TEXTURE_2D, tex->id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->surf->w, tex->surf->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->surf->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, NULL);

antTex结构是:

GLuint id;          //Texture ID
int w, h;           //Original Image Size
int rw, rh;         //Resized Canvas Size
SDL_Surface* surf;  //Resized Surface

关于调整图像大小的一切看起来工作正常(使用SDL的SDL_SaveBMP函数来检查生成的图像),我使用SDL2_image.h的IMG_Load来加载原始图像 .

当我绘制一个纹理映射到它的平面时,GL_BLEND被启用时根本没有显示,当我禁用它时,我得到这个(红色是窗口的背景颜色):

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/error_zps03e1e5a1.png

原始图像是这样的:

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/d_zpsc8b9af6f.png

这是我绘制平面的函数,其中纹理映射到它(参数是antTex * tex,int x,int y):

glBindTexture(GL_TEXTURE_2D, tex->id);
int w, h;
w=tex->w;
h=tex->h;
GLfloat tw, th;
th=(GLfloat)tex->h/(GLfloat)tex->rh;
tw=(GLfloat)tex->w/(GLfloat)tex->rw;
glPushMatrix();
    glTranslatef(x, y, 0);
    glBegin(GL_QUADS);
        glNormal3f(0, 0, 1);
        glTexCoord2f(0, th);    glVertex2f(0, h);
        glTexCoord2f(tw, th);   glVertex2f(w, h);
        glTexCoord2f(tw, 0);    glVertex2f(w, 0);
        glTexCoord2f(0, 0);     glVertex2f(0, 0);
    glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, NULL);

1 回答

  • 1

    使用glTexCoord2f传递u和v坐标以将纹理渲染到四边形中时遇到问题 .

    你需要改变:

    glTexCoord2f(0, th);    glVertex2f(0, h);
    glTexCoord2f(tw, th);   glVertex2f(w, h);
    glTexCoord2f(tw, 0);    glVertex2f(w, 0);
    glTexCoord2f(0, 0);     glVertex2f(0, 0);
    

    成:

    glTexCoord2f(0, 1);    glVertex2f(0, h);
    glTexCoord2f(1, 1);   glVertex2f(w, h);
    glTexCoord2f(1, 0);    glVertex2f(w, 0);
    glTexCoord2f(0, 0);     glVertex2f(0, 0);
    

相关问题