首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制GL_TEXTURE_RECTANGLE与GL_TEXTURE_2D

绘制GL_TEXTURE_RECTANGLE与GL_TEXTURE_2D
EN

Stack Overflow用户
提问于 2013-06-18 10:39:43
回答 1查看 2.8K关注 0票数 3

我试着做一个函数来绘制二维纹理和矩形纹理。

它把二维的画得很好。然而,在绘制任何矩形纹理时,它会将它们完全画成白色。

代码语言:javascript
复制
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加载。不走运。

什么也不起作用:它在某种程度上适用于Texture2D。

我用它就像:

代码语言:javascript
复制
GLuint ID = LoadImage("RECT_116.png", GL_TEXTURE_RECTANGLE);

//Do other stuff here..

DrawTexture(GL_TEXTURE_RECTANGLE, ID, X1, Y1, X2, Y2);

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

代码语言:javascript
复制
GLuint ID = LoadImage("2D_116.png", GL_TEXTURE_2D);

//Do other stuff here..

DrawTexture(GL_TEXTURE_2D, ID, X1, Y1, X2, Y2);

起作用了..。知道我做错什么了吗?

EN

回答 1

Stack Overflow用户

发布于 2013-06-18 13:45:54

来自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

代码语言:javascript
复制
glTexParameteri(Target, GL_TEXTURE_WRAP_S, 
    Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17166808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档