- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在尝试使用 C++ 加载标记文件并使用 OpenGL 渲染它。目前颜色都混合了(红色变成蓝色,绿色变成红色,蓝色变成绿色)。我目前将其放入显存的代码是。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
其中数据是像素数据,其余部分不言自明。文件以 24 位格式保存,没有压缩,是从 photoshop 保存的。
最佳答案
您的 glTexImage2D
是正确的,所以这不是问题所在。
我确实需要(在加载 TGA 文件时)交换颜色分量。试试这个:
typedef struct
{
unsigned char imageTypeCode;
short int imageWidth;
short int imageHeight;
unsigned char bitCount;
unsigned char *imageData;
} TGAFILE;
bool LoadTGAFile(char *filename, TGAFILE *tgaFile)
{
FILE *filePtr;
unsigned char ucharBad;
short int sintBad;
long imageSize;
int colorMode;
unsigned char colorSwap;
// Open the TGA file.
filePtr = fopen(filename, "rb");
if (filePtr == NULL)
{
return false;
}
// Read the two first bytes we don't need.
fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
// Which type of image gets stored in imageTypeCode.
fread(&tgaFile->imageTypeCode, sizeof(unsigned char), 1, filePtr);
// For our purposes, the type code should be 2 (uncompressed RGB image)
// or 3 (uncompressed black-and-white images).
if (tgaFile->imageTypeCode != 2 && tgaFile->imageTypeCode != 3)
{
fclose(filePtr);
return false;
}
// Read 13 bytes of data we don't need.
fread(&sintBad, sizeof(short int), 1, filePtr);
fread(&sintBad, sizeof(short int), 1, filePtr);
fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
fread(&sintBad, sizeof(short int), 1, filePtr);
fread(&sintBad, sizeof(short int), 1, filePtr);
// Read the image's width and height.
fread(&tgaFile->imageWidth, sizeof(short int), 1, filePtr);
fread(&tgaFile->imageHeight, sizeof(short int), 1, filePtr);
// Read the bit depth.
fread(&tgaFile->bitCount, sizeof(unsigned char), 1, filePtr);
// Read one byte of data we don't need.
fread(&ucharBad, sizeof(unsigned char), 1, filePtr);
// Color mode -> 3 = BGR, 4 = BGRA.
colorMode = tgaFile->bitCount / 8;
imageSize = tgaFile->imageWidth * tgaFile->imageHeight * colorMode;
// Allocate memory for the image data.
tgaFile->imageData = (unsigned char*)malloc(sizeof(unsigned char)*imageSize);
// Read the image data.
fread(tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);
// Change from BGR to RGB so OpenGL can read the image data.
for (int imageIdx = 0; imageIdx < imageSize; imageIdx += colorMode)
{
colorSwap = tgaFile->imageData[imageIdx];
tgaFile->imageData[imageIdx] = tgaFile->imageData[imageIdx + 2];
tgaFile->imageData[imageIdx + 2] = colorSwap;
}
fclose(filePtr);
return true;
}
关于c++ - 加载 TGA 文件并将其与 OpenGL 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046270/
我正在制作一款游戏。我想隐藏我所有的 .tga 文件。我将所有文件的字符串内容连接在一个文件中,以使其对玩家不可见。我希望我的程序通过创建临时 .tga 文件来加载图片保存的内容。 因此,我正在尝试从
我正在寻找用于 java 的小型免费 TGA 图像加载类或库。理想情况下,结果是 BufferedImage。 是的,我已经用谷歌搜索过,但大多数结果都已过时,或者是相当大的库,其中包含许多我不需要的
当从内存写入图像缓冲区(包含从 tga 文件加载的 RGBA 像素数据)到文件返回时,我有时观察到一个奇怪的行为 图像缓冲区是从 TGA 文件加载的,该文件使用从该线程窃取和改编的算法: Loadin
我正在编写一个 .tga 阅读器。我可以完美地读取标题,然后我想读取文件的数据部分,但是如果我到达那里,它会给我错误: Unhandled exception at 0x76ffa2ce in TGA
我一直在学习有关加载 TGA 文件的基本 OpenGl 教程,以用作 3d 对象的纹理。我已经能够从 TGA header 加载数据,但是当我尝试加载实际图像数据时,它失败了。我不确定哪里出了问题。这
查看LibGDX BitmapFont documentation我没有看到有办法将多个 .tga 文件添加到 BitmapFont 中。当字体大小大于 ~42 时,这只会给我带来麻烦,因此它必须创建
我的 Targa 阅读器有非常非常小的问题。一个像素关闭,另外 2 个像素为黑色 :S 我正在加载的 24 位 targa 文件如下所示: 请注意左上角的白色像素。左上角的第一个像素是白色的。 但是当
我正在尝试读取我在 Paint.net 中创建的文件的 TGA header 。好像哪里不对劲。如果我使用规范中的 header 结构,如下所示: typedef struct { CHAR
我写了一个 TGA 加载器来加载 TGA 文件。它可以很好地加载和保存 32 位 TGA 文件,但在加载和保存 24 位时,它就搞砸了。 来自 Photoshop 的 TGA 24 位文件示例: 我的
我想就 .tga 文件格式解析问题获得一些帮助。我有我使用了很长时间的代码: int fileLength = Input.tellg(); vecto
我正在将 OpenGL FBO 内容写入 TGA 文件。我以 BGR 格式读取像素并保存到未压缩的 TGA。奇怪的是,如果我保存单调颜色(无纹理),我的导出器写入正常,但如果像素数据出现从纹理中我得到
我目前正在尝试使用 C++ 加载标记文件并使用 OpenGL 渲染它。目前颜色都混合了(红色变成蓝色,绿色变成红色,蓝色变成绿色)。我目前将其放入显存的代码是。 glTexImage2D(GL_TEX
在我的应用程序中,我使用的是图像,这些图像也可以是 .tga(Targa Graphic) 文件,当我使用 .tga 文件创建 BitmapImage 的实例时,它抛出异常说“没有适合完成此操作的成像
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
给我一个图像加载库,它可以加载 JPG、PNG、TIFF、TGA 等格式。如果它能告诉我像素格式,如 R8G8B8、R5G6B5 等,那就太好了。 最佳答案 BufferedImage 是一种非常
我在 this code 工作并考虑到为 32 位“修复”它的注释,但它似乎仍然不起作用。我很确定它与 TGA descriptor 有关.这将使用 0-3 位作为 alpha channel 深度,
TGA 图像规范包含以下两个字段: Field 5.1 (2 bytes) - X-origin of Image: These bytes specify the absolute hori
我正在尝试为我的 3D 模型创建纹理。只要我只加载图像文件,它就可以正常工作。我正在使用 Microsoft Visual C++ 2008 Express,我一直在寻找解决这个“问题”的方法,将资源
我有一个 TGA 文件和一个库,里面已经有了我阅读和使用 TGA 所需的一切。 这个类有一个叫做pixels()的方法,它返回一个指针指向存储像素为RGBRGBRGB的内存区域... 我的问题是,如何
我正在尝试加载一个 tga/bmp 文件。这工作正常,但最终结果如下所示: 我尝试加载的图像如下所示: 我正在使用的一些代码: GLuint texture; const char* filename
我是一名优秀的程序员,十分优秀!