Draw GL_TEXTURE_RECTANGLE vs. GL_TEXTURE_2D

Draw GL_TEXTURE_RECTANGLE vs. GL_TEXTURE_2D

本文关键字:TEXTURE GL 2D vs RECTANGLE Draw      更新时间:2023-10-16

我正在尝试制作一个函数来绘制2D纹理和矩形纹理。

它把2D的画得很好。然而,当绘制任何矩形纹理时,它会将其绘制为完全白色…

GLuint LoadImage(std::string ImageTitle, GLenum Target)
{
    Image Img(("Images/" + ImageTitle).c_str());
    std::vector<std::uint8_t> Buffer;
    ImageToBuffer(Buffer, Img);
    GLuint ID;
    glGenTextures(1, &ID);
    glBindTexture(Target, ID);
    glTexParameteri(Target, GL_TEXTURE_WRAP_S, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_WRAP_T, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(Target, 0, GL_RGB, Img.Width(), Img.Height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, Buffer.data());
    return ID;
}
void DrawTexture(GLenum Target, GLuint ID, float X1, float Y1, float X2, float Y2)
{
    GLfloat ViewPort[4];
    glGetFloatv(GL_VIEWPORT, ViewPort);
    glEnable(Target);
    glBindTexture(Target, ID);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0);
        glVertex2f(X1, Y1);
        glTexCoord2f(0, Target == GL_TEXTURE_2D ? 1 : ViewPort[3]);
        glVertex2f(X1, Y2);
        glTexCoord2f(Target == GL_TEXTURE_2D ? 1 : ViewPort[2], Target == GL_TEXTURE_2D ? 1 : ViewPort[3]);
        glVertex2f(X2, Y2);
        glTexCoord2f(Target == GL_TEXTURE_2D ? 1 : ViewPort[2], 0);
        glVertex2f(X2, Y1);
    glEnd();
    glDisable(Target);
}

我还尝试使用glTextCoordf(X, Y),其中X和Y是1,而不是ViewPort宽度/高度。尝试使用宽度/高度,仍然没有。尝试纹理宽度和高度。我也尝试将矩形加载为2D。没有运气。

Nothing works:S然而,它却可以为Texture2D工作。

我这样使用它:

GLuint ID = LoadImage("RECT_116.png", GL_TEXTURE_RECTANGLE);
//Do other stuff here..
DrawTexture(GL_TEXTURE_RECTANGLE, ID, X1, Y1, X2, Y2);

,它失败了,但当我在2D纹理上这样做时:

GLuint ID = LoadImage("2D_116.png", GL_TEXTURE_2D);
//Do other stuff here..
DrawTexture(GL_TEXTURE_2D, ID, X1, Y1, X2, Y2);

它. .知道我哪里做错了吗?

From http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml

如果目标是GL_PROXY_TEXTURE_2D, GL_PROXY_TEXTURE_1D_ARRAY,GL_PROXY_TEXTURE_CUBE_MAP或GL_PROXY_TEXTURE_RECTANGLE,没有数据从数据中读取,但是所有的纹理图像状态都被重新计算,检查一致性,并对照实现进行检查功能。的纹理请求的纹理大小,它将所有图像状态设置为0,但是不生成错误(参见glGetError)。查询整个mipmap数组,使用大于或等于1的图像数组级别。

如果目标是GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE或GL_TEXTURE_CUBE_MAP目标,数据作为序列从数据中读取有符号字节或无符号字节,短字节或长字节,或单精度字节浮点值,取决于类型。这些值被分组转换为一个、两个、三个或四个值的集合,具体取决于格式表单元素。每个数据字节被视为8个1位元素,用位顺序由GL_UNPACK_LSB_FIRST决定(参见glPixelStore)。

因此,一致性检查可能由于某种原因而失败。

你似乎在做不同的边界条件取决于GL_TEXTURE_2D或GL_TEXTURE_RECTANGLE

glTexParameteri(Target, GL_TEXTURE_WRAP_S, 
    Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);

你有没有试过删除那个条件,看看是否会改变情况?