- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Ubuntu 14.04 中使用 SOIL 时遇到了一些实际问题。我已经设法让 SOIL 在 Windows 环境中工作,并将代码从 Windows 移植到 ubuntu。
我确信我已经成功地将 SOIL 安装在我的 Ubuntu 机器上。我有 libSOIL.a 和 libSOIL.so 文件以及 SOIL.h
然而,当我开始使用我的代码时,一切都出了问题。这是我逐步构建的代码,因此在继续添加附加功能之前我已经测试了代码片段。
我正在开发的代码非常简单(实际上这只是一个尝试并获得跨多个平台工作的东西的检查),它只是渲染一个围绕其中心旋转并具有纹理贴图的 3D 立方体。我希望使用 SOIL 来加载纹理。之前我已经使用我自己的例程来加载纹理来检查这一切是否有效,这很好。一旦我更改了将纹理加载到 SOIL 函数的行,它就会失败。
我使用的代码是
SOIL_load_OGL_texture("/home/ubuntu/Documents/OpenGL3/OpenGL_Basic_Engine/c2_4_DrawCubeTextureAdvanced/Textures/Crate.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);
这是自此代码的上一个版本以来所做的唯一更改。
我通过执行简单的“fopen”和“if{}else{}”检查来确保该文件是可打开的,我什至安装了 Code::Blocks,这样我就有了一个可以单步调试的调试器按行。当我的调试器到达 SOIL 函数并且我尝试单步执行该函数时,程序返回段错误并退出,甚至没有将我发送到 SOIL 函数。
如果有人有任何想法,我将不胜感激,因为我已经为这个问题苦苦挣扎了好几个星期了!
干杯
************编辑************
让我们看看现在是否可以获得所有必需的信息(我必须将机器移至我的 ubuntu 机器上才能获取源代码)
首先我的代码是 C++(但我认为 SOIL 是用 C 编写的? - 因此有两个标签)
失败的源文件如下:
#include "CubeTextureAdvanced.h"
#ifdef _WIN32
#include <BasicEngine\Engine.h>
#include "soil\SOIL.h"
#elif __linux__
#include "../BasicEngine/Engine.h"
#include "/usr/local/include/SOIL.h"
#include <pthread.h>
#endif
using namespace BasicEngine;
#ifdef __linux__
void junk() { //dummy procedure to allow pthread to be linked
int i;
i = pthread_getconcurrency();
}
#endif
int main(int argc, char **argv)
{
std::cout << "create new engine" << std::endl;
Engine* engine = new Engine();
engine->Init();
std::cout << "get shader manager and create programme" << std::endl;
engine->GetShader_Manager()->CreateProgram("cubeShader", "/home/ubuntu/Documents/OpenGL3/OpenGL_Basic_Engine/c2_4_DrawCubeTextureAdvanced/Shaders/Cube_Vertex_Shader.glsl",
"/home/ubuntu/Documents/OpenGL3/OpenGL_Basic_Engine/c2_4_DrawCubeTextureAdvanced/Shaders/Cube_Fragment_Shader.glsl");
std::cout << "get shader manager and get shader" << std::endl;
CubeTextureAdvanced* cube = new CubeTextureAdvanced();
int program = engine->GetShader_Manager()->GetShader("cubeShader");
if (program != 0)
{
cube->SetProgram(program);
cube->Create();
}
else
{
std::cout << "invalid program..."; std::cin.get();
}
//this is the routine that works to load textures that i wish to replace with SOIL
//unsigned int texture = engine->GetTexture_Loader()->LoadTexture("Textures\\Crate.bmp", 256, 256);
//cube->SetTexture("Create", texture);
std::cout << "use SOIL to load an OpenGL Texture" << std::endl;
FILE * pFile;
pFile = fopen("/home/ubuntu/Documents/OpenGL3/OpenGL_Basic_Engine/c2_4_DrawCubeTextureAdvanced/Textures/Crate.bmp", "r");
if(pFile != NULL)
{
std::cout << "FILE OPEN" << std::endl;
fclose(pFile);
}
GLuint Texturetmp;
Texturetmp = SOIL_load_OGL_texture("/home/ubuntu/Documents/OpenGL3/OpenGL_Basic_Engine/c2_4_DrawCubeTextureAdvanced/Textures/Crate.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);
std::cout << Texturetmp << std::endl;
std::cout << "loaded texture" << std::endl;
cube->SetTexture("Create", Texturetmp);
std::cout << "get the models manager and set the model" << std::endl;
engine->GetModels_Manager()->SetModel("cube", cube);
std::cout << "run the programme" << std::endl;
engine->Run();
delete engine;
return (0);
}
我在终端中运行的编译命令是:
g++ -Wall -Wextra ./../BasicEngine/Engine.cpp ./../BasicEngine/Core/Init/Init_GLUT.cpp ./../BasicEngine/Core/Init/Init_GLEW.cpp ./../BasicEngine/Managers/Models_Manager.cpp ./../BasicEngine/Managers/Scene_Manager.cpp ./../BasicEngine/Managers/Shader_Manager.cpp ./CubeTextureAdvanced.cpp ./../BasicEngine/Rendering/Models/Model.cpp ./../BasicEngine/Rendering/Texture/TextureLoader.cpp main.cpp -lglut -lGL -lGLU -lGLEW -lpthread -lX11 -lSOIL -std=gnu++11 -o main
返回的警告是一些类型限定符被忽略
或未使用的参数
。但没有任何涉及 SOIL 函数调用或任何暗示在此之前可能停止 SOIL 工作的问题(据我所知)。
其他可能有帮助的源文件是 init_GLUT 和 init_GLEW 文件,如下所示:
init_GLUT:
#include "../Init/Init_GLUT.h"
using namespace BasicEngine;
using namespace Core::Init;
Core::IListener* Init_GLUT::listener = NULL;
Core::WindowInfo Init_GLUT::windowInformation;
#ifdef __linux__
Display *dpy;
Window root;
GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo *vi;
Colormap cmap;
XSetWindowAttributes swa;
Window win;
GLXContext glc;
XWindowAttributes gwa;
XEvent xev;
void Init_GLUT::linuxinit()
{
std::cout << "Linux detected" << std::endl;
dpy = XOpenDisplay(NULL);
if (dpy == NULL)
{
std::cout << "\n\tcannont connect to X server\n\n" << std::endl;
exit(0);
}
root = DefaultRootWindow(dpy);
vi = glXChooseVisual(dpy, 0, att);
if (vi == NULL)
{
std::cout << "\n\tno appropriate visual found\n\n" << std::endl;
exit(0);
}
else
{
printf("\n\tvisual %p selected\n", (void*)vi->visualid); //%p creates a hexadecimal output like in glxinfo
}
cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);
swa.colormap = cmap;
swa.event_mask = ExposureMask | KeyPressMask;
std::cout << "end of Linux compiler directives" << std::endl;
}
#endif
void Init_GLUT::init(const Core::WindowInfo& windowInfo,
const Core::ContextInfo& contextInfo,
const Core::FramebufferInfo& framebufferInfo)
{
windowInformation = windowInfo;
//i need some fake things here
int fakeargc = 1;
char* fakeargv[] = { "fake", NULL };
glutInit(&fakeargc, fakeargv);
if (contextInfo.core)
{
glutInitContextVersion(contextInfo.major_version,
contextInfo.minor_version);
glutInitContextProfile(GLUT_CORE_PROFILE);
}
else
{
//doesn't matter in compatibility mode
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
}
//old functions from main.cpp now using info from the structures
glutInitDisplayMode(framebufferInfo.flags);
glutInitWindowPosition(windowInfo.position_x, windowInfo.position_y);
glutInitWindowSize(windowInfo.width, windowInfo.height);
glutCreateWindow(windowInfo.name.c_str());
std::cout << "GLUT:initialised" << std::endl;
#ifdef _WIN32
//Lets add some debug capability
glEnable(GL_DEBUG_OUTPUT);
#endif
Core::Init::Init_GLEW::Init();
#ifdef _WIN32
glDebugMessageCallback(DebugOutput::myCallback, NULL);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, TRUE);
#endif
//these call backs are used for rendering
glutIdleFunc(idleCallback);
glutCloseFunc(closeCallback);
glutDisplayFunc(displayCallback);
glutReshapeFunc(reshapeCallback);
//init GLEW (can be called in main.cpp)
//clean up
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
//our method to display some info. Needs contextInfo and windowinfo
printOpenGLInfo(windowInfo, contextInfo);
}
//starts the rendering loop
void Init_GLUT::run()
{
std::cout << "GLUT:\t Start Running" << std::endl;
glutMainLoop();
}
void Init_GLUT::close()
{
std::cout << "GLUT:\t Finished" << std::endl;
glutLeaveMainLoop;
}
void Init_GLUT::idleCallback(void)
{
//do nothing, just redisplay
glutPostRedisplay();
}
void Init_GLUT::displayCallback()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0, 0.0, 0.0, 1);
glutSwapBuffers;
if (listener)
{
listener->notifyBeginFrame();
listener->notifyDisplayFrame();
glutSwapBuffers();
listener->notifyEndFrame();
}
}
void Init_GLUT::reshapeCallback(int width, int height)
{
if (windowInformation.isReshapable == true)
{
if (listener)
{
listener->notifyReshape(width, height, windowInformation.width, windowInformation.height);
}
windowInformation.width = width;
windowInformation.height = height;
}
}
void Init_GLUT::closeCallback()
{
close();
}
void Init_GLUT::enterFullscreen()
{
glutFullScreen();
}
void Init_GLUT::exitFullscreen()
{
glutLeaveFullScreen();
}
void Init_GLUT::setListener(Core::IListener* iListener)
{
listener = iListener;
}
void Init_GLUT::printOpenGLInfo(const Core::WindowInfo& windowInfo,
const Core::ContextInfo& contextInfo)
{
const unsigned char* renderer = glGetString(GL_RENDERER);
const unsigned char* vendor = glGetString(GL_VENDOR);
const unsigned char* version = glGetString(GL_VERSION);
std::cout << "*******************************************************************************" << std::endl;
std::cout << "GLUT:\tVendor : " << vendor << std::endl;
std::cout << "GLUT:\tRenderer : " << renderer << std::endl;
std::cout << "GLUT:\tOpenGl version: " << version << std::endl;
std::cout << "GLUT:\tInitial window is '" << windowInfo.name << "', with dimensions (" << windowInfo.width
<< "X" << windowInfo.height;
std::cout << ") starts at (" << windowInfo.position_x << "X" << windowInfo.position_y;
std::cout << ") and " << ((windowInfo.isReshapable) ? "is" : "is not ") << " redimensionable" << std::endl;
std::cout << "GLUT:\tInitial Framebuffer contains double buffers for" << std::endl;
std::cout << "GLUT:\t OpenGL context is " << contextInfo.major_version << "." << contextInfo.minor_version;
std::cout << " and profile is " << ((contextInfo.core) ? "core" : "compatibility") << std::endl;
std::cout << "*****************************************************************" << std::endl;
}
init_GLEW:
#include "../Init/Init_GLEW.h"
using namespace BasicEngine;
using namespace Core;
using namespace Core::Init;
void Init_GLEW::Init(){
glewExperimental = true;
if (glewInit() == GLEW_OK)
{
std::cout << "GLEW: Initialised" << std::endl;
}
if (glewIsSupported("GL_VERSION_4_5"))
{
std::cout << "GLEW Version is 4.5 :) \n";
}
else
{
std::cout << "GLEW 4.5 not supported :( \n";
}
}
最后我的SOIL.h文件内容如下:
/**
@mainpage SOIL
Jonathan Dummer
2007-07-26-10.36
Simple OpenGL Image Library
A tiny c library for uploading images as
textures into OpenGL. Also saving and
loading of images is supported.
I'm using Sean's Tool Box image loader as a base:
http://www.nothings.org/
I'm upgrading it to load TGA and DDS files, and a direct
path for loading DDS files straight into OpenGL textures,
when applicable.
Image Formats:
- BMP load & save
- TGA load & save
- DDS load & save
- PNG load
- JPG load
OpenGL Texture Features:
- resample to power-of-two sizes
- MIPmap generation
- compressed texture S3TC formats (if supported)
- can pre-multiply alpha for you, for better compositing
- can flip image about the y-axis (except pre-compressed DDS files)
Thanks to:
* Sean Barret - for the awesome stb_image
* Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts
* everybody at gamedev.net
**/
#ifndef HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY
#define HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY
#ifdef __cplusplus
extern "C" {
#endif
/**
The format of images that may be loaded (force_channels).
SOIL_LOAD_AUTO leaves the image in whatever format it was found.
SOIL_LOAD_L forces the image to load as Luminous (greyscale)
SOIL_LOAD_LA forces the image to load as Luminous with Alpha
SOIL_LOAD_RGB forces the image to load as Red Green Blue
SOIL_LOAD_RGBA forces the image to load as Red Green Blue Alpha
**/
enum
{
SOIL_LOAD_AUTO = 0,
SOIL_LOAD_L = 1,
SOIL_LOAD_LA = 2,
SOIL_LOAD_RGB = 3,
SOIL_LOAD_RGBA = 4
};
/**
Passed in as reuse_texture_ID, will cause SOIL to
register a new texture ID using glGenTextures().
If the value passed into reuse_texture_ID > 0 then
SOIL will just re-use that texture ID (great for
reloading image assets in-game!)
**/
enum
{
SOIL_CREATE_NEW_ID = 0
};
/**
flags you can pass into SOIL_load_OGL_texture()
and SOIL_create_OGL_texture().
(note that if SOIL_FLAG_DDS_LOAD_DIRECT is used
the rest of the flags with the exception of
SOIL_FLAG_TEXTURE_REPEATS will be ignored while
loading already-compressed DDS files.)
SOIL_FLAG_POWER_OF_TWO: force the image to be POT
SOIL_FLAG_MIPMAPS: generate mipmaps for the texture
SOIL_FLAG_TEXTURE_REPEATS: otherwise will clamp
SOIL_FLAG_MULTIPLY_ALPHA: for using (GL_ONE,GL_ONE_MINUS_SRC_ALPHA) blending
SOIL_FLAG_INVERT_Y: flip the image vertically
SOIL_FLAG_COMPRESS_TO_DXT: if the card can display them, will convert RGB to DXT1, RGBA to DXT5
SOIL_FLAG_DDS_LOAD_DIRECT: will load DDS files directly without _ANY_ additional processing
SOIL_FLAG_NTSC_SAFE_RGB: clamps RGB components to the range [16,235]
SOIL_FLAG_CoCg_Y: Google YCoCg; RGB=>CoYCg, RGBA=>CoCgAY
SOIL_FLAG_TEXTURE_RECTANGE: uses ARB_texture_rectangle ; pixel indexed & no repeat or MIPmaps or cubemaps
**/
enum
{
SOIL_FLAG_POWER_OF_TWO = 1,
SOIL_FLAG_MIPMAPS = 2,
SOIL_FLAG_TEXTURE_REPEATS = 4,
SOIL_FLAG_MULTIPLY_ALPHA = 8,
SOIL_FLAG_INVERT_Y = 16,
SOIL_FLAG_COMPRESS_TO_DXT = 32,
SOIL_FLAG_DDS_LOAD_DIRECT = 64,
SOIL_FLAG_NTSC_SAFE_RGB = 128,
SOIL_FLAG_CoCg_Y = 256,
SOIL_FLAG_TEXTURE_RECTANGLE = 512
};
/**
The types of images that may be saved.
(TGA supports uncompressed RGB / RGBA)
(BMP supports uncompressed RGB)
(DDS supports DXT1 and DXT5)
**/
enum
{
SOIL_SAVE_TYPE_TGA = 0,
SOIL_SAVE_TYPE_BMP = 1,
SOIL_SAVE_TYPE_DDS = 2
};
/**
Defines the order of faces in a DDS cubemap.
I recommend that you use the same order in single
image cubemap files, so they will be interchangeable
with DDS cubemaps when using SOIL.
**/
#define SOIL_DDS_CUBEMAP_FACE_ORDER "EWUDNS"
/**
The types of internal fake HDR representations
SOIL_HDR_RGBE: RGB * pow( 2.0, A - 128.0 )
SOIL_HDR_RGBdivA: RGB / A
SOIL_HDR_RGBdivA2: RGB / (A*A)
**/
enum
{
SOIL_HDR_RGBE = 0,
SOIL_HDR_RGBdivA = 1,
SOIL_HDR_RGBdivA2 = 2
};
/**
Loads an image from disk into an OpenGL texture.
\param filename the name of the file to upload as a texture
\param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_texture
(
const char *filename,
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Loads 6 images from disk into an OpenGL cubemap texture.
\param x_pos_file the name of the file to upload as the +x cube face
\param x_neg_file the name of the file to upload as the -x cube face
\param y_pos_file the name of the file to upload as the +y cube face
\param y_neg_file the name of the file to upload as the -y cube face
\param z_pos_file the name of the file to upload as the +z cube face
\param z_neg_file the name of the file to upload as the -z cube face
\param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_cubemap
(
const char *x_pos_file,
const char *x_neg_file,
const char *y_pos_file,
const char *y_neg_file,
const char *z_pos_file,
const char *z_neg_file,
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Loads 1 image from disk and splits it into an OpenGL cubemap texture.
\param filename the name of the file to upload as a texture
\param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc.
\param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_single_cubemap
(
const char *filename,
const char face_order[6],
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Loads an HDR image from disk into an OpenGL texture.
\param filename the name of the file to upload as a texture
\param fake_HDR_format SOIL_HDR_RGBE, SOIL_HDR_RGBdivA, SOIL_HDR_RGBdivA2
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_HDR_texture
(
const char *filename,
int fake_HDR_format,
int rescale_to_max,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Loads an image from RAM into an OpenGL texture.
\param buffer the image data in RAM just as if it were still in a file
\param buffer_length the size of the buffer in bytes
\param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_texture_from_memory
(
const unsigned char *const buffer,
int buffer_length,
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Loads 6 images from memory into an OpenGL cubemap texture.
\param x_pos_buffer the image data in RAM to upload as the +x cube face
\param x_pos_buffer_length the size of the above buffer
\param x_neg_buffer the image data in RAM to upload as the +x cube face
\param x_neg_buffer_length the size of the above buffer
\param y_pos_buffer the image data in RAM to upload as the +x cube face
\param y_pos_buffer_length the size of the above buffer
\param y_neg_buffer the image data in RAM to upload as the +x cube face
\param y_neg_buffer_length the size of the above buffer
\param z_pos_buffer the image data in RAM to upload as the +x cube face
\param z_pos_buffer_length the size of the above buffer
\param z_neg_buffer the image data in RAM to upload as the +x cube face
\param z_neg_buffer_length the size of the above buffer
\param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_cubemap_from_memory
(
const unsigned char *const x_pos_buffer,
int x_pos_buffer_length,
const unsigned char *const x_neg_buffer,
int x_neg_buffer_length,
const unsigned char *const y_pos_buffer,
int y_pos_buffer_length,
const unsigned char *const y_neg_buffer,
int y_neg_buffer_length,
const unsigned char *const z_pos_buffer,
int z_pos_buffer_length,
const unsigned char *const z_neg_buffer,
int z_neg_buffer_length,
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Loads 1 image from RAM and splits it into an OpenGL cubemap texture.
\param buffer the image data in RAM just as if it were still in a file
\param buffer_length the size of the buffer in bytes
\param face_order the order of the faces in the file, any combination of NSWEUD, for North, South, Up, etc.
\param force_channels 0-image format, 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_load_OGL_single_cubemap_from_memory
(
const unsigned char *const buffer,
int buffer_length,
const char face_order[6],
int force_channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Creates a 2D OpenGL texture from raw image data. Note that the raw data is
_NOT_ freed after the upload (so the user can load various versions).
\param data the raw data to be uploaded as an OpenGL texture
\param width the width of the image in pixels
\param height the height of the image in pixels
\param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_create_OGL_texture
(
const unsigned char *const data,
int width, int height, int channels,
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Creates an OpenGL cubemap texture by splitting up 1 image into 6 parts.
\param data the raw data to be uploaded as an OpenGL texture
\param width the width of the image in pixels
\param height the height of the image in pixels
\param channels the number of channels: 1-luminous, 2-luminous/alpha, 3-RGB, 4-RGBA
\param face_order the order of the faces in the file, and combination of NSWEUD, for North, South, Up, etc.
\param reuse_texture_ID 0-generate a new texture ID, otherwise reuse the texture ID (overwriting the old texture)
\param flags can be any of SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS | SOIL_FLAG_MULTIPLY_ALPHA | SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT | SOIL_FLAG_DDS_LOAD_DIRECT
\return 0-failed, otherwise returns the OpenGL texture handle
**/
unsigned int
SOIL_create_OGL_single_cubemap
(
const unsigned char *const data,
int width, int height, int channels,
const char face_order[6],
unsigned int reuse_texture_ID,
unsigned int flags
);
/**
Captures the OpenGL window (RGB) and saves it to disk
\return 0 if it failed, otherwise returns 1
**/
int
SOIL_save_screenshot
(
const char *filename,
int image_type,
int x, int y,
int width, int height
);
/**
Loads an image from disk into an array of unsigned chars.
Note that *channels return the original channel count of the
image. If force_channels was other than SOIL_LOAD_AUTO,
the resulting image has force_channels, but *channels may be
different (if the original image had a different channel
count).
\return 0 if failed, otherwise returns 1
**/
unsigned char*
SOIL_load_image
(
const char *filename,
int *width, int *height, int *channels,
int force_channels
);
/**
Loads an image from memory into an array of unsigned chars.
Note that *channels return the original channel count of the
image. If force_channels was other than SOIL_LOAD_AUTO,
the resulting image has force_channels, but *channels may be
different (if the original image had a different channel
count).
\return 0 if failed, otherwise returns 1
**/
unsigned char*
SOIL_load_image_from_memory
(
const unsigned char *const buffer,
int buffer_length,
int *width, int *height, int *channels,
int force_channels
);
/**
Saves an image from an array of unsigned chars (RGBA) to disk
\return 0 if failed, otherwise returns 1
**/
int
SOIL_save_image
(
const char *filename,
int image_type,
int width, int height, int channels,
const unsigned char *const data
);
/**
Frees the image data (note, this is just C's "free()"...this function is
present mostly so C++ programmers don't forget to use "free()" and call
"delete []" instead [8^)
**/
void
SOIL_free_image_data
(
unsigned char *img_data
);
/**
This function resturn a pointer to a string describing the last thing
that happened inside SOIL. It can be used to determine why an image
failed to load.
**/
const char*
SOIL_last_result
(
void
);
#ifdef __cplusplus
}
#endif
#endif /* HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY */
我将 libSOIL.a
存储在 /usr/lib
我也尝试过将 libSOIL.a
存储在 usr/local/lib
中,但这似乎没有帮助。
SOIL.h
位于 usr/local/include
希望现在这些信息足以让某人发现我的(菜鸟)错误。
对大量代码表示歉意。
另外,还必须归功于 www.in2gpu.com,我一直在遵循该网站的教程才走到这一步。
干杯
最佳答案
我怀疑库等没有正确链接。
建议使用 makefile,类似于:
CC := /usr/bin/g++
RM := /usr/bin/rm
SRCS := ./../BasicEngine/Engine.cpp \
./../BasicEngine/Core/Init/Init_GLUT.cpp \
./../BasicEngine/Core/Init/Init_GLEW.cpp \
./../BasicEngine/Managers/Models_Manager.cpp \
./../BasicEngine/Managers/Scene_Manager.cpp \
./../BasicEngine/Managers/Shader_Manager.cpp \
./CubeTextureAdvanced.cpp \
./../BasicEngine/Rendering/Models/Model.cpp \
./../BasicEngine/Rendering/Texture/TextureLoader.cpp
TEMP := $(basename $(SRCS))
OBJS := $(addsuffix .o, $(TEMP))
NAME := main
CFLAGS := -Wall -Wextra -Wconversion -std=gnu++11 -c
LFLAGS := -lglut -lGL -lGLU -lGLEW -lpthread -lX11 -lSOIL
.PHONY: all
all : $(NAME)
%.o:%.cpp
<tab>$(CC) $(CFLAGS) -o $@ $< -I.
$(NAME): $(OBJS)
<tab>$(CC) -o $@ $^ $(LFLAGS)
PHONY: clean
clean:
<tab> $(RM) -f $(OBJS)
<tab> $(RM) -f $(NAME)
注意:替换<tab>
使用制表符
然后使用类似于以下内容的内容进行编译/链接:
make -f makefile
关于c++ - 在 Ubuntu 14.04 中使用 SOIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37257913/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!