OpenGl纹理问题

时间:2011-07-04 21:07:31

标签: c# opengl textures

纹理头痛......

我无法理解我在哪里出错了。我的问题是纹理没有对齐。左边的图像是OpenGl纹理四边形,右边是原始图像。注意列如何在纹理四边形中偏移。

Mis-aligned texture

我不知道我是不是正确加载纹理,或者在将其上传到视频记录时出错,或者只是使用错误的texCoords ...

图像是bmp(R8 G8 B8 A8),错误就在这里:

(加载位图和上传纹理)

        Bitmap fontBmp = new Bitmap("font2.bmp");
        MemoryStream ms = new MemoryStream();

        fontBmp.Save(ms, ImageFormat.Bmp);
        int imageWidth = fontBmp.Width;
        int imageHeight = fontBmp.Height;
        byte[] fontBytes = ms.GetBuffer();
        fontBmp.Dispose();
        ms.Dispose();

        Gl.glBindTexture(Gl.GL_TEXTURE_2D, (int)TexId.font);
        Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
        Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_MODULATE); // Try GL_DECAL...
        Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, imageWidth, imageHeight, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, fontBytes);

(四方......)

        Gl.glTexCoord2f(0f + (0.5f / 128f), (127f / 128f) + (0.5f / 128f));
        Gl.glVertex2i(50, 50);

        Gl.glTexCoord2f(0f + (0.5f / 128f), 0f + (0.5f / 128f)); 
        Gl.glVertex2i(50, this.Height - 50);

        Gl.glTexCoord2f((127f / 128f) + (0.5f / 128f), 0f + (0.5f / 128f)); 
        Gl.glVertex2i(this.Width - 50, this.Height - 50);

        Gl.glTexCoord2f((127f / 128f) + (0.5f / 128f), (127f / 128f) + (0.5f / 128f)); 
        Gl.glVertex2i(this.Width - 50, 50);

有没有人发现造成这种情况的任何事情?

2 个答案:

答案 0 :(得分:2)

问题不在于纹理坐标。

问题是你正在加载纹理错误。您忘记删除位图标题,因此所有实际数据都会被移位,并且每行的结尾都会移动到下一行的开头。

纹理包装会将像素从右后方包裹到同一条线上,但不合适的区域会向下移动一行。使用“夹到边缘”模式也不会发生纹理包装。

答案 1 :(得分:0)

你的问题是你的glTexCoord坐标。如果你这样做

    Gl.glTexCoord2f(0f, 0f);
    Gl.glVertex2i(50, 50);

    Gl.glTexCoord2f(0f, 1f); 
    Gl.glVertex2i(50, this.Height - 50);

    Gl.glTexCoord2f(1f, 1f); 
    Gl.glVertex2i(this.Width - 50, this.Height - 50);

    Gl.glTexCoord2f(1f, 0f); 
    Gl.glVertex2i(this.Width - 50, 50);
例如,它应该给你对齐的定位。纹理坐标从0到1.如果在我的示例中将1更改为2,则纹理将在每个方向上重复两次,在该四边形上为其提供四个副本。

注意,这是未经测试的代码,我可能有错误的纹理坐标顺序,但重点是你不应该使用像素尺寸,而是将纹理尺寸参数化为[0,1]比例。

原因是你的纹理参数被设置为换行。取0表示纹理的开头,1表示其维度的100%,如果指定一些非整数,则它将在纹理的中间开始或结束,而任何非零整数都是大小的倍数。你的纹理,所以它似乎重复。

编辑: 这也是获得我正在谈论的效果所需要的,以替换您对GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T的设置。

    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
相关问题