我正在尝试创建一个绘制2D纹理和矩形纹理的函数。
它完美地绘制了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 Width / Height。尝试使用宽度/高度,仍然没有。尝试纹理宽度和高度。我也尝试将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);
它有效..任何想法我做错了什么?
答案 0 :(得分:2)
来自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);
您是否尝试删除该条件以查看是否会改变这种情况?