我想一个位图加载到一个OpenGL纹理,并显示到屏幕上,但是当我这样做,红色和蓝色值似乎切换(如:蓝色图像显示为橙色,绿色的图像保持不变,等等. ).这个问题只在加载位图时才存在,我可以加载.pngs相对无错误.
这是我用来加载位图和设置纹理的代码.我正在使用DevIl,但我不确定它是多么相关,因为当我使用不同的系统时存在问题(我不太记得什么,它是window.h中的一个函数,我相信):
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
ilEnable(IL_ORIGIN_SET);
ILuint image;
ilGenImages(1, &image);
ilBindImage(image);
ilLoad(IL_BMP, "Data/NeHe.bmp"); // Incidentally, loading a png, although it fixes the problem,
// rotates the image 180 degrees. Not sure if that's important or not,
// But it's why I added the first line of code
glGenTextures(3, &_texture[0]);
glBindTexture(GL_TEXTURE_2D, _texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), \
0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData());
Run Code Online (Sandbox Code Playgroud)
ilInit()
并且glEnable(GL_TEXTURE_2D)
在程序的早期都被调用,以及其他不太相关的功能.任何帮助找到(并希望修复)问题的原因将非常感激.
我在将图像加载到Devil时遇到问题所以我提供了我如何构建lib以及我如何使用它的确切方法.
从他们的网站下载Devel来源.
$ unzip DevIL-1.7.8.zip
$ mkdir devil
$ cd Devil-1.7.8
+-------------------------------------------+
| Just type: |
| autoreconf -i |
| ./configure <your options here> |
| make |
| sudo make install |
+-------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
如果我使用autoreconf -i,那么./configure有前缀和ilu和ilut.我收到一个错误..forgot ..来记录它.这有多重要?我刚刚没用过它.
$ chmod +x configure
$ ./configure --prefix=/home/path/to/TestingDevil/devil --enable-ILU --enable-ILUT
$ make
$ make install
Run Code Online (Sandbox Code Playgroud)
所以在这一点上我应该建立我的图书馆.我将devil 简单示例(simple.c)下载到TestingDevil/simple/simple.c构建它.
$ gcc -I ../devil/include -L ../devil/lib/ simple.c -o simple -lIL -lILU -lILUT
$ cp ../devil/lib/*.so* .
Run Code Online (Sandbox Code Playgroud)
我添加了一个图像(jpg)进行测试.
$ LD_LIBRARY_PATH=. …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用DevIL进行图像处理的Android应用程序.我从这个项目得到了DevIL的端口及其依赖库.我编辑并提取了我需要的东西.编译很好,库工作,但当我尝试加载JPEG文件时它不会...
使用DevIL错误代码,我发现错误编号为1506,这IL_LIB_JPEG_ERROR
意味着我的JPEG库中存在问题.我已经尝试更新到最新的JPEG库,但都失败了.我也试过其他JPEG文件,但我没有任何成功.
这是我的android.mk
文件显示JPEG和DevIL模块片段:
#libjpeg
include $(CLEAR_VARS)
LOCAL_MODULE := libjpeg
LOCAL_CFLAGS := -g -Dlinux -DFT2_BUILD_LIBRARY=1 -DPHYSFS_NO_CDROM_SUPPORT=1 -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
LOCAL_CPPFLAGS := ${LOCAL_CFLAGS}
LOCAL_C_INCLUDES := \
${JPEG_SRC_PATH}
LOCAL_SRC_FILES := \
${JPEG_SRC_PATH}jquant1.c \
${JPEG_SRC_PATH}jdtrans.c \
${JPEG_SRC_PATH}jerror.c \
${JPEG_SRC_PATH}wrppm.c \
${JPEG_SRC_PATH}jcparam.c \
${JPEG_SRC_PATH}jdmarker.c \
${JPEG_SRC_PATH}jidctfst.c \
${JPEG_SRC_PATH}jctrans.c \
${JPEG_SRC_PATH}cdjpeg.c \
${JPEG_SRC_PATH}jcomapi.c \
${JPEG_SRC_PATH}jmemansi.c \
${JPEG_SRC_PATH}jquant2.c \
${JPEG_SRC_PATH}wrtarga.c \
${JPEG_SRC_PATH}transupp.c \
${JPEG_SRC_PATH}jdmerge.c \
${JPEG_SRC_PATH}jdhuff.c \
${JPEG_SRC_PATH}jdmaster.c \
${JPEG_SRC_PATH}jcprepct.c \
${JPEG_SRC_PATH}jutils.c \
${JPEG_SRC_PATH}jccoefct.c \ …
Run Code Online (Sandbox Code Playgroud) 我有一个以这种方式定义的文件路径:
const char* GROUND_TEXTURE_FILE = "objects/textures/grass.jpg";
Run Code Online (Sandbox Code Playgroud)
这是我用来加载图像的函数:
bool loadTexImage2D(const string &fileName, GLenum target) {
...
// this will load image data to the currently bound image
// at first, we must convert fileName, for ascii, this method is fine?
wstring file(fileName.begin(), fileName.end());
if(ilLoadImage(file.c_str()) == IL_FALSE) { //here the program falls
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题?ilLoadImage
调用时为什么程序会掉线?我认为,file.c_str()
作为一种wchar_t *
类型应该可以正常工作吗?谢谢你的回答:)
我正在尝试将 DevIL.NET 集成到 3ds Max 中,以自动将我的图像转换为单一格式。为此,我在 C# 中创建了一个类库,它接受字符串并返回新文件路径
public static class FileConverter
{
public static string ConvertFile(string _sOriginal)
{
// Load the file, save the file, return the new filepath
}
}
Run Code Online (Sandbox Code Playgroud)
该项目引用了 DevIL.NET,它是 32 位版本。我的应用程序是 64 位版本,并提供BadImageFormatException
. 说“它”不是有效的 Win32 应用程序。
我已经尝试通过在文件中添加额外的行来使我的应用程序成为 32 位.csproj
:<PlatformTarget>x86</PlatformTarget>
。这样,我的测试项目确实可以工作,但我的类库却不能,因为 3ds Max 是一个 64 位应用程序。
如何将这 32-64 个问题排列起来,以便我的插件能够工作?假设 3ds Max 将是 64 位,而 DevIL.NET 将是 32 位。我似乎无法自己从 VC++ Express 2008 中的源代码构建 64 位 DevIL.NET。
正如标题所示,我尝试使用 DevIL 加载图像,然后将其传递给 OpenGL。我使用这段代码作为错误控制
const char* filename = "back.bmp";
if (!ilLoadImage(filename))
{
throw runtime_error(std::string("Unable to load image") +filename);
}
Run Code Online (Sandbox Code Playgroud)
对于 if 语句,返回错误
error C2664: 'ilLoadImage' : cannot convert parameter 1 from 'const char *' to 'const wchar_t *'
Run Code Online (Sandbox Code Playgroud)
如果我定义filename
为const wchar_t* filename
,我会收到错误
error C2664: 'ilLoadImage' : cannot convert parameter 1 from 'const char *' to 'const wchar_t *'
Run Code Online (Sandbox Code Playgroud)
所以现在我不会因为好奇为什么 [filename].bmp 文件是 wchar_t* 类型,或者 wchar_t 是什么(谷歌让我困惑)而让你感到好奇,我只会问我必须做什么才能使它工作:为什么它不起作用?我错过了什么?我确信一定有一个非常简短的解决方案。它看起来就像是那种错误。
谢谢。
我正在尝试使用DevIL加载图像,然后创建纹理。我有一个名为的类Texture
,并且正在构造函数中进行所有这些操作。一个有效的上下文已创建。第一次调用时遇到访问冲突glTextureParameteri()
,因此我猜纹理未正确绑定。我只是没有理由不绑定它。
这是构造函数:
Texture::Texture(const std::string& filename){
//DevIL handle for the image
unsigned int ilID;
ilGenImages(1, &ilID);
ilBindImage(ilID);
ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
if (!ilLoad(IL_BMP, (ILstring)filename.c_str())){
DebugUtility::gl_log_err("Failed to load image &s\n", filename.c_str()); //Just function that prints to log file
return;
}
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
glGenTextures(1, &texture);
//"texture" is global GLuint
glBindTexture(GL_TEXTURE_2D, texture);
//LINE BELOW CAUSES ACCESS VIOLATION!
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTextureParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT),
0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData());
ilDeleteImages(1, &ilID);
//Again, prints …
Run Code Online (Sandbox Code Playgroud) 我必须是一个菜鸟,总是在Linux上安装时遇到问题.我正在尝试安装:http://openil.sourceforge.net/download.php.所以我使用DL页面中的Devil 1.7.8 tar.gz来阅读手册(http://openil.sourceforge.net/docs/index.php).
我看到没有预编译的.so作为手册说明.
它尝试编译自己,我看到在执行配置,构建,安装后,没有对usr/lib或usr/include(作为手动状态)添加OpenIL.
我应该通过包管理器安装它...但我仍然不知道我需要包含/链接到哪些文件.
更新:仔细看看上面2的安装输出显示,实际上是在用户/本地下安装了东西(非常感谢手册).
所以,为了确定,我如何将.so和.h链接到我的程序.
我正在使用Visual Studio 2010,C++.
我要做的是从加载的图像中检索像素数据(特定于RGB颜色),然后在各种检查中使用它.目前,我想循环遍历所有数据,并能够检测像素何时是某种颜色(特定的R,G和B值).
我应该注意到我正在使用DevIL,我更喜欢继续使用DevIL(我已经看到了一些建议,可以帮助处理图像处理的其他工具).
现在,据我所知,DevIL函数ilgetData()检索一个指针,该指针包含一维字节数组中所有像素的所有RGB值.我不知道如何存储使用此函数获取的数据,然后在for循环中使用它.
示例代码非常感谢.