【问题标题】:Draw GL_TEXTURE_RECTANGLE vs. GL_TEXTURE_2D绘制 GL_TEXTURE_RECTANGLE 与 GL_TEXTURE_2D
【发布时间】:2013-06-18 10:39:43
【问题描述】:

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

它可以完美地绘制 2D 图像。但是,当绘制任何 Rectangle 纹理时,它会将它们绘制成完全白色的......

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 宽度/高度。尝试使用宽度/高度,仍然没有。尝试纹理宽度和高度。我也尝试将 Rect 作为 2D 加载。没有运气。

没有任何效果: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);

它有效..任何想法我做错了什么?

【问题讨论】:

  • 您确定您的硬件驱动程序支持矩形纹理? glGetError 说什么?
  • "我正在尝试创建一个函数来绘制 2D 纹理和矩形纹理。" 为什么?您使用 OpenGL 3 对此进行了标记,因此很明显您使用的是允许 NPOT 常规纹理的 OpenGL 版本。那么你用什么矩形来绘制它们需要相同的功能呢?

标签: c++ opengl opengl-3


【解决方案1】:

来自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 目标,从数据中读取数据作为一个序列 有符号或无符号字节、short 或 long 或单精度 浮点值,取决于类型。这些值被分组 根据格式,分为一个、两个、三个或四个值的集合,以 表单元素。每个数据字节被视为八个 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);

您是否尝试过删除该条件以查看是否会改变情况?

【讨论】:

  • 我看不出该规范引用如何提供任何可能有问题的见解,也看不出包装行为应该如何改变这种情况(但是好的,这至少值得一试)。
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 2012-11-28
  • 2013-01-02
  • 1970-01-01
  • 2023-04-10
  • 2015-10-31
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多